iOS 8 UITableView轮换错误

因此,在XCode 6上编译应用程序后,我注意到只有在iOS 8上运行时才会出现一个奇怪的错误: UITableView在更新其框架后采用了错误的内部维度。

现在我将尝试解释具体情况:我们在其侧面旋转了一个UITableView ,它基本上是一个水平的UITableView 。 它通过tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2); 。 现在设置转换后,然后设置其框架 – 一切都很好。 但是,当然系统在大多数情况下会向父节点发送另一个帧更改,因为它需要将父节点设置为实际大小而不是XIB大小或任何初始化大小。 在那一刻 – 当我重新发布子视图,包括表格视图 – 一切都出错了。 实际上表视图的框架只是设置为包含视图的bounds ,但随后是内部scrollview(在iOS 8中, UITableView里面有另一个UIScrollView ,名为UITableViewWrapperView 。由于UITableView本身是一个UIScrollView ,我不能找出为什么他们需要另一个……)取一个等于父宽度的“高度”。 而“height”实际上是width属性,只是旋转。

现在我们可以很容易地估计它们有一个错误,它将内部UIScrollView的宽度与父UITableView的实际宽度相关联,这可能是通过读取.frame.size.width而不是.bounds.size.width 。 但奇怪的是,在调查UITableView子视图的框架时 – 似乎它们都很好! 所以它必定是某个地方的渲染问题。

因此我们留下了一个水平表,顶部有一个空白间隙,因为单元格的“高度”是320而不是568,而单元格的“宽度”很好,设置为320。

我会很高兴听到其他人遇到这个问题(或者来自Apple),但我终于找到了一个解决方案,并将问题发布在此处,供我和其他人参考。

因此,使其表现的变化不是这样做的:

 - (void)layoutSubviews { tableView.frame = self.bounds; } 

我重置了转换,将帧设置为UITableView在转换后本地期望的边界,然后设置转换并设置正确的帧。 这有点令人困惑,但在这里:

 - (void)layoutSubviews { if (UIDevice.currentDevice.systemVersion.floatValue >= 8.f) { // iOS 8 layout bug! Table's "height" taken from "width" after changing frame. But then if we cancel transform, set width/height to the final width/height, and rotate it and set to the virtual width/height - it works! CGRect rotatedFrame = self.bounds, unrotatedFrame = rotatedFrame; unrotatedFrame.size.width = rotatedFrame.size.height; unrotatedFrame.size.height = rotatedFrame.size.width; tableView.transform = CGAffineTransformIdentity; tableView.frame = unrotatedFrame; tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2); tableView.frame = rotatedFrame; } else { tableView.frame = self.bounds; } } 

这似乎是iOS8的一个新问题。 当您想要旋转对象时,它不再显示围绕对象框架的左上角旋转。

iOS8的Apple文档声明“一个对象围绕它的中心点旋转”。 因此,当垂直UITableView旋转90度时,它可能会从视图中消失,因为中心点可能偏离可见区域。 为了使表格显示为围绕表格的左上角旋转,您现在还必须将帧的平移量等于帧宽度和帧高度之间的差值。

重要的是要注意您需要连接变换以获得所需的结果,如下所示:

首先创建一个90度旋转变换:

  CGAffineTransform xform_rotate = CGAffineTransformMakeRotation(-M_PI * 0.5); 

然后创建一个等于表宽度和高度之差的平移量变量:

 float translateAmount = (camThumbsTableView.frame.size.height/2)-(camThumbsTableView.frame.size.width/2); 

然后将原始旋转变换与翻译连接起来:

  CGAffineTransform xform_total = CGAffineTransformTranslate(xform_rotate, translateAmount, translateAmount); 

完成后,您现在可以按如下方式转换tableView:

  self.camThumbsTableView.transform = xform_total; 

这将具有旋转和平移tableView的效果,使得它现在看起来已经围绕tableView的左上角而不是围绕中心点旋转。