9

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

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

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

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

这两个似乎都不理想。

我已将此链接添加 到一个演示此问题的简单示例项目中。所做的唯一更改是故事板和主视图控制器的实现。

旋转前 旋转 旋转前旋转后

4

7 回答 7

5

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

- (void) viewWillLayoutSubviews
{
    self.tableView.contentSize = CGSizeMake(self.tableView.frame.size.height, self.tableView.contentSize.height);
}
于 2012-11-28T19:41:11.970 回答
1

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

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

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

于 2013-03-06T03:04:13.087 回答
0

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

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

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

希望这也对你有用。

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

于 2013-06-21T04:55:28.093 回答
0

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

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

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

于 2013-08-22T05:37:26.287 回答
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 发送到视图控制器后仍然需要自动布局。

于 2014-07-28T08:32:07.653 回答
0

我有同样的问题。

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

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

于 2013-12-09T14:31:08.920 回答
0

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

于 2016-01-09T17:14:00.013 回答