菜鸟教程小白 发表于 2022-12-12 11:58:38

iOS 8 UITableView 旋转错误


                                            <p><p>所以在 XCode 6 上编译了一个应用程序后,我注意到一个奇怪的错误,只有在 iOS 8 上运行时才会发生:
<code>UITableView</code> 在更新其框架后采用了错误的<em>inner</em> 尺寸。</p>

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

<p>现在我们可以很容易地估计他们有一个错误,将内部 <code>UIScrollView</code> 的宽度与父 <code>UITableView</code> 的实际宽度相关联,这可能是通过阅读<code>.frame.size.width</code> 而不是 <code>.bounds.size.width</code>。
但奇怪的是,在调查<code>UITableView</code>的subviews的frame的时候,似乎都没有问题!所以一定是某处的<em>渲染</em>问题。</p>

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

<p>我很高兴听到其他遇到此问题的人(或来自 Apple)的消息,但我终于找到了解决方案并将其与问题一起发布在这里,以供我和其他人将来引用。</p ></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>所以让它表现的改变,而不是这样做:</p>

<pre><code>- (void)layoutSubviews
{
    tableView.frame = self.bounds;
}
</code></pre>

<p>我已重置转换,将框架设置为 UITableView 在转换后本地期望的范围,然后设置转换并设置正确的框架。这有点令人困惑,但在这里:</p>

<pre><code>- (void)layoutSubviews
{
    if (UIDevice.currentDevice.systemVersion.floatValue &gt;= 8.f)
    {
      // iOS 8 layout bug! Table&#39;s &#34;height&#34; taken from &#34;width&#34; 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;
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于iOS 8 UITableView 旋转错误,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26230928/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26230928/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iOS 8 UITableView 旋转错误