UITableView 不会滚动
Posted
技术标签:
【中文标题】UITableView 不会滚动【英文标题】:UITableView Won't Scroll 【发布时间】:2014-03-14 04:08:08 【问题描述】:我的故事板中有一个UITableViewController
,但出于某种奇怪的原因,我无法滚动它。请观看此视频以了解我的意思:
UITableView Won't Scroll
该表有大约 40 行,因此可以显示大量信息。它的行为有点像框架非常高,因此它能够显示所有行,并且拖动的唯一动作是拉伸和反弹。
我在-viewDidAppear:
中添加了一些代码来检查frame
、bounds
、contentSize
和insets
:
- (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 类的作品