【问题标题】:UITableView Won't ScrollUITableView 不会滚动
【发布时间】: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 来提取核心数据方法。我的项目中还有其他几个视图控制器可以很好地显示/滚动。

标签: ios uitableview storyboard


【解决方案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/stackoverflow/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.

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多