因此,在XCode 6上编译应用程序后,我注意到只有在iOS 8上运行时才会出现一个奇怪的错误:
更新其框架后UITableView
采用了错误的内部尺寸。
现在我将尝试解释具体情况:
我们在其侧面旋转了UITableView
,这基本上是横向UITableView
。它通过tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
发生。
现在设置转换后,然后设置其框架 - 一切都很好。
但是,当然系统在大多数情况下会向父节点发送另一个帧更改,因为它需要将父节点设置为实际大小而不是XIB大小或任何初始化大小。在那一刻 - 当我重新发布子视图,包括表视图 - 一切都出错了。
实际上,表格视图的框架只是设置为包含视图的bounds
,但随后是内部滚动视图(在iOS 8中,UITableView
内部有另一个UIScrollView
,称为{{ 1}}。由于UITableViewWrapperView
本身就是UITableView
,我无法弄清楚为什么他们需要另一个......)取一个等于父宽度的“高度”。而“height”实际上是UIScrollView
属性,只能旋转。
现在我们可以很容易地估算出他们有一个错误,将内部width
的宽度与父UIScrollView
的实际宽度相关联,这可能是通过阅读UITableView
而不是.frame.size.width
。
但奇怪的是,在调查.bounds.size.width
子视图的框架时 - 似乎它们都很好!所以它必须是某处的呈现问题。
所以我们留下了一个水平表,顶部有一个空白,因为单元格的“高度”是320而不是568,而单元格的“宽度”很好,设置为320。
我会非常高兴听到其他人遇到这个问题(或者来自Apple),但我终于找到了一个解决方案,并将问题发布在此处,以供将来参考我和其他人。
答案 0 :(得分:1)
因此,使其表现的变化不是这样做的:
- (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;
}
}
答案 1 :(得分:1)
这似乎是iOS8的新问题。当您想要旋转对象时,它不再显示围绕对象框架的左上角旋转。
针对iOS8的Apple文档说明了一个对象围绕它的中心点旋转了#34;。因此,当垂直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的左上角而不是围绕中心点旋转。