UITableView 不会滚动

Posted

技术标签:

【中文标题】UITableView 不会滚动【英文标题】:UITableView Won't Scroll 【发布时间】:2014-03-14 04:08:08 【问题描述】:

我的故事板中有一个UITableViewController,但出于某种奇怪的原因,我无法滚动它。请观看此视频以了解我的意思:

UITableView Won't Scroll

该表有大约 40 行,因此可以显示大量信息。它的行为有点像框架非常高,因此它能够显示所有行,并且拖动的唯一动作是拉伸和反弹。

我在-viewDidAppear: 中添加了一些代码来检查frameboundscontentSizeinsets

- (void) viewDidAppear:(BOOL)animated 
    [super viewDidAppear:animated];

    UIEdgeInsets insets = self.tableView.contentInset;
    NSLog(@"top layout guide: %f", self.topLayoutGuide.length);
    NSLog(@"table insets: %@", NSStringFromUIEdgeInsets(insets));

    NSLog(@"frame: %@", NSStringFromCGRect(self.tableView.frame));
    NSLog(@"bounds: %@", NSStringFromCGRect(self.tableView.bounds));
    NSLog(@"contentSize: %@", NSStringFromCGSize(self.tableView.contentSize));


这是打印出来的:

top layout guide: 64.000000
table insets: 64, 0, 0, 0
frame: 0, 0, 320, 568
bounds: 0, -64, 320, 568
contentSize: 320, 1980

那么,contentSize 显示有很多东西要显示,frame/bounds 显示桌子只有屏幕那么高,那为什么它不能滚动呢?

我尝试从我的故事板中删除它并从头开始重新创建它,以防万一发生调整并导致问题,但在我在故事板中重建该视图控制器后它仍然发生。

编辑:

我注意到scrollbars 在第一次显示视图控制器时会闪烁,它们看起来近似正确的长度来表示一个屏幕的表数据价值。我设置了一个循环,每隔几秒钟在桌子上调用-flashScrollIndicators,当视图控制器被推入堆栈时,它甚至在初始闪烁后都不显示滚动条。

【问题讨论】:

确保滚动已启用? 是的,故事板中的tableview启用了滚动。 尝试以编程方式设置。那是 UITableViewController.?你有没有为它添加任何子类? 尝试以编程方式设置它。是的,我有一个子类,这样我就可以实现数据源方法。我正在使用 NSFetchedResultsController 来提取核心数据方法。我的项目中还有其他几个视图控制器可以很好地显示/滚动。 【参考方案1】:

我认为您的问题在于 AutoLayout。如果您使用的是 AutoLayout,那么您还应该提供一些约束来根据它的 superview 正确调整它的大小。 我认为您必须在 TableView 上提供宽度限制。和其他约束,例如与 TopLayoutGuide 和 BottomLayoutGuide 的垂直距离。 如果您使用的是 Xcode 5.0 或更新版本,那么 Xcode 将向您发出有关缺少约束或冲突约束的警告。 如果您不了解约束,请参阅 this。 另一个关于 AutoLayout Constraints 的好教程 this。

【讨论】:

【参考方案2】:

我不知道为什么这会导致问题,也许有人可以帮助我理解。

我采用了通常的隔离策略,即注释掉大部分代码,直到问题消失,然后缩小范围,直到找到问题为止。这一切都归结为这行代码:

NSLog(@"top layout guide: %f", self.topLayoutGuide.length);

使用那行代码,表格拒绝滚动。

没有那行代码,表格会正常运行。

演示问题的项目 zip 文件:

http://www.inadaydevelopment.com/***/TableScrollBug.zip

【讨论】:

我在 self.topLayoutGuide.length 上遇到了类似的问题,如果它用于布局计算,push/pop 导航会很奇怪,最后滚动会死掉。如果我将 self.topLayoutGuide.length 替换为常量(纵向为 64)一切正常。【参考方案3】:

我花了这么多时间发现 AutoLayout 已启用,当它被禁用时,它开始滚动

那么,AutoLayout 是否被禁用?

【讨论】:

是的,AutoLayout 已启用(我的整个项目都需要启用它)。我所有的其他表格视图都可以正常工作,我不知道为什么这个不同。 是的,但已经尝试过了。我删除了它,问题仍然存在。 ://【参考方案4】:

您可以尝试自动添加缺少的约束。在 Xcode 中使用 Editor -> Resolve Auto Layouts Issues -> Add Missing Constraints.

【讨论】:

以上是关于UITableView 不会滚动的主要内容,如果未能解决你的问题,请参考以下文章

5 星评级不会通知 UITableView 更新值;自定义 UIView 类的作品

UITableView 不会滚动到某个位置

UITableView 在水平滚动后不会响应点击

uitableview 不会滚动到底部

UITableView 不会使用 UISearchBar 滚动

NSURLConnection 在 UITableView 滚动之前不会“触发”