gpt4 book ai didi

iOS 8 UITableView 旋转错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:03:35 25 4
gpt4 key购买 nike

所以在 XCode 6 上编译应用程序后,我注意到一个奇怪的错误,它只在 iOS 8 上运行时发生:UITableView 在更新其框架后采用了错误的内部 尺寸。

现在我将尝试解释确切的情况:我们有一个侧边旋转的 UITableView,它基本上是一个水平的 UITableView。它通过 tableView.transform = CGAffineTransformMakeRotation(-M_PI/2); 发生。现在在设置转换后,然后设置它的框架 - 一切都很好。但是当然,在大多数情况下,系统会向父级发送另一个帧更改,因为它需要将父级设置为实际大小,而不是 XIB 大小或任何初始化大小。在那一刻——当我重新布局 subview 时,包括 TableView ——一切都出错了。实际上, TableView 的框架只是简单地设置为包含 View 的 bounds,但是内部 ScrollView (在 iOS 8 中,UITableView 有另一个 UIScrollView 在里面,叫做 UITableViewWrapperView。由于 UITableView 本身就是一个 UIScrollView,我不明白为什么他们需要另一个。 ..) 采用等于父宽度的“高度”。而“高度”实际上是 width 属性,只是旋转了。

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

所以我们留下了一个顶部有空白间隙的水平表格,因为单元格的“高度”是 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;
}
}

关于iOS 8 UITableView 旋转错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26230928/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com