【问题标题】:UITableView in storyboard not updating content size on rotation故事板中的 UITableView 不更新旋转时的内容大小
【发布时间】:2012-09-14 09:25:51
【问题描述】:

我正在开发针对 iOS 6 的项目,该项目利用了故事板和自动布局。在故事板中有很多地方将 UITableView 作为子视图添加到视图控制器视图中。此表格视图使用情节提要中的原型单元格。

我们遇到的问题是,如果视图控制器最初以横向加载,然后设备旋转为纵向,则表格视图开始垂直和水平滚动。表格视图单元格以正确的尺寸绘制,但右侧有额外的空白。

看起来,虽然表格视图的框架和边界在旋转时被更新为正确的大小,但表格视图的内容大小却没有。无论更新轮换如何变化,内容大小都保持不变。

如果使用程序化表格视图单元格,问题不会出现。 我发现了一些花哨的解决方法,1.) 调用 reloadData 或 reloadRowsAtIndexPaths:withRowAnimation: 2.) 手动设置属性 contentSize。

这两个似乎都不理想。

我添加了这个 link to a dead simple sample project 演示了这个问题。所做的唯一更改是故事板和主视图控制器的实现。

旋转前 旋转后

【问题讨论】:

  • 我很困惑。在您的示例中,它似乎正在工作。
  • @mkral 它在运行 Xcode 4.5 时对我来说坏了。如果您以横向启动应用程序,然后旋转为纵向,则表格视图将同时垂直和水平滚动。
  • 好吧,我很笨。我认为纵向到横向是问题所在。我再也没有回去过。
  • 从 nib 加载时也会发生这种情况。但无法在 iOS 7 上重现。

标签: ios uitableview storyboard autolayout contentsize


【解决方案1】:

我遇到了同样的问题 - 似乎找不到任何与此相关的书面答案。我最终像您在中提到的那样手动修改了 UITableView contentSize:

- (void) viewWillLayoutSubviews
{
    self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.height, self.tableView.contentSize.height);
}

【讨论】:

  • 我无法解决我的问题。我在 Master-Detail 布局中看到了基本相同的问题。我在 Detail Controller 中有一个 UIViewController,它包含一个 tableview。当我旋转 iPad 时,tableview 根本不会调整大小。
  • 我正在阅读 Ray Wenderlich 的 iOS6 教程,其中自动布局的内容与表格有关。还没有尝试过,但看起来表格的东西实际上可能必须单独设置,然后加载到 UIViewController 中的容器中。我对此完全不确定。希望下午晚些时候能到达。如果我找到任何确定的内容,我会在这里更新。
  • 尝试使用 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.height, self.tableView.contentSize.height);}
  • 首先,我猜 contentSize 的宽度应该等于 tableView 的宽度而不是高度。其次,这不起作用,因为此时屏幕尚未旋转,因此帧大小不反映最终布局。这在 viewDidLayout 中也不起作用,因为这会触发异常。
【解决方案2】:

我今天遇到了这个问题,并向 Apple 提交了错误报告。

看来,如果您使用带有 UI 元素和自动布局的自定义单元格,则 UIScrollView 内容大小会出现问题。

如果您删除所有 UI 元素,或者关闭自动布局,或者使用工厂单元格(基本等),一切正常。

【讨论】:

    【解决方案3】:

    我已经在我的项目中纠正了同样的问题。 我想这是故事板中的一个错误。

    然后我通过设置在 willAutorotate 方法中手动编码解决了它

    tableview.contentsize = CGSizeMake(tableview.width, tableview.contentsize.height);
    

    希望这对你也有用。

    如果您发现任何有关相同的苹果文档,请同时更新我。在此之前,您可以使用相同的解决方案。

    【讨论】:

    • 哪个链接?你想说什么?
    【解决方案4】:

    看来,如果您使用带有 UI 元素和自动布局的自定义单元格,则 UIScrollView 内容大小会出现问题。

    我必须为我的自定义 UITableViewCells 关闭 AutoLayout 才能在更新数据时滚动到底部,然后 [self.tableView reloadData]。

    启用自动布局后,tableView.contentSize 正在更新,但除非我旋转设备,否则我仍然无法滚动到底部。

    【讨论】:

      【解决方案5】:

      我发现以下内容对我有用:

      - (void)viewDidLayoutSubviews
      {
          [super viewDidLayoutSubviews];
          dispatch_async(dispatch_get_main_queue(), ^{
              self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.width, self.tableView.contentSize.height);
          });
      }
      

      注意异步调度:如果该行将同步执行,则 contentSize 更改将在当前布局完成之前触发另一个布局传递。这会触发异常:

      发送 -viewDidLayoutSubviews 到 视图控制器。

      【讨论】:

        【解决方案6】:

        约束的使用帮助了我。由于您使用的是 Storyboard,因此为所有边缘设置约束值非常容易,因此 UITableView 将始终填充整个 ViewController(当然,如果 UITableView 填充整个 ViewController),无论设备方向如何。

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。

          我找到了this 链接。当我尝试实现这一点时,我没有找到视图的自动调整大小属性然后我点击Master View Controller,然后点击File Inspector并取消选中Use Autolayout,然后转到Attributes inspector自动调整大小应该是然后你可以改变你想要的属性。

          我相信你一定已经弄清楚了。

          【讨论】:

            猜你喜欢
            • 2019-05-09
            • 1970-01-01
            • 1970-01-01
            • 2012-03-23
            • 2014-03-15
            • 1970-01-01
            • 2016-12-16
            • 2019-01-16
            • 2012-03-08
            相关资源
            最近更新 更多