故事板中的UITableView在轮换时不更新内容大小

时间:2012-09-21 23:14:23

标签: ios uitableview storyboard autolayout contentsize

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

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

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

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

这些似乎都不太理想。

我已添加此内容 link to a dead simple sample project证明了这个问题。唯一的变化是故事板和主视图控制器的实现。

轮换前 Before rotation 轮换后 After rotation

7 个答案:

答案 0 :(得分:6)

我遇到了同样的问题 - 似乎无法找到与此相关的任何记录答案。我最终手动修改了UITableView contentSize,如下所示:

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

答案 1 :(得分:1)

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

如果您使用带有UI元素和autoLayout的自定义单元格,则会出现UIScrollView内容大小存在问题。

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

答案 2 :(得分:1)

我遇到了同样的问题。

我找到了this链接。当我尝试实现此功能时,我没有找到我的视图的自动调整大小属性,然后点击了Master View Controller,然后点击File Inspector并取消选中Use Autolayout,然后转到{{ 1}}自动调整大小应该在那里你可以改变你想要的属性。

我相信你一定能够解决这个问题。

答案 3 :(得分:0)

  

如果您使用带有UI元素和autoLayout的自定义单元格,则会出现UIScrollView内容大小存在问题。

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

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

答案 4 :(得分:0)

我发现以下内容适合我:

- (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发送到后仍需要自动布局   查看控制器。

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

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

然后我通过设置

在willAutorotate方法中通过手动编码解决了它
tableview.contentsize = CGSizeMake(tableview.width, tableview.contentsize.height);

希望这对你也有用。

如果您发现任何关于相同的苹果文档,请更新我。直到那时你可以使用相同的解决方案。