iOS 8 UITableView 旋转错误

2024-02-28

因此,在 XCode 6 上编译应用程序后,我注意到一个奇怪的错误,该错误仅在 iOS 8 上运行时才会发生: 这UITableView采取错误的inner更新框架后的尺寸。

现在我将尝试解释一下具体情况: 我们有一个UITableView侧面旋转,这基本上形成了一个水平的UITableView。它发生通过tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);。 现在设置变换后,然后设置其框架 - 一切都很好。 当然,在大多数情况下,系统会向父级发送另一个帧更改,因为它需要将父级设置为实际大小,而不是 XIB 大小或任何初始化大小。在那一刻 - 当我重新布局子视图(包括表视图)时 - 一切都出了问题。 实际上表视图的框架只是简单地设置为bounds包含视图的视图,然后是内部滚动视图(在 iOS 8 中UITableView还有另一个UIScrollView在里面,称为UITableViewWrapperView. As UITableView is a UIScrollView就其本身而言,我无法弄清楚为什么他们需要另一个......)采用等于父宽度的“高度”。而“高度”实际上是width属性,仅旋转。

现在我们可以轻松估计他们在关联内部宽度方面存在错误UIScrollView到父级的实际宽度UITableView,这可能是通过阅读.frame.size.width而不是.bounds.size.width。 但奇怪的是,当调查子视图的框架时UITableView——看来他们都不错啊!所以它一定是一个渲染某处有问题。

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

我会很高兴听到其他遇到此问题的人(或来自苹果)的消息,但我终于找到了解决方案并将其与问题一起发布在这里,以供我和其他人将来参考。


因此,使其行为发生的变化不是这样做:

- (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;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 8 UITableView 旋转错误 的相关文章

随机推荐