滚动 UITableView 的奇怪行为
Posted
技术标签:
【中文标题】滚动 UITableView 的奇怪行为【英文标题】:Strange behavior on scroll UITableView 【发布时间】:2014-10-12 17:10:07 【问题描述】:我有一个带有嵌套滚动和表格视图的单一视图和这个分层树:
(该表加载了一些从 example 获取的 Huckleberry Finn 行。)
在 viewWillAppear 上,我以编程方式在最后一行滚动表格视图
-(void)viewWillAppear:(BOOL)animated
[self.tableView reloadData];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.tableView numberOfRowsInSection:0]-1 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath
atScrollPosition:UITableViewScrollPositionBottom
animated:YES];
和一切都按预期工作,在两个方向上。如您所见,文本被正确截断。
我已将我的项目上传到 Github,以便您可以看到它正在运行。下载here.
现在,如果你在 cellForRowAtIndexPath 方法中添加这一行:
cell.textLabel.numberOfLines=0;
单元格会自动调整大小以嵌入并显示整个文本标签:
但是,这是我亲爱的朋友们的问题,正如您所见,表格没有滚动到最后一行,而是滚动到上方 5-6 行。我不明白为什么。
如果 NumberOfLines 是 2,3 等等,也会发生同样的事情。只有值 1 才能使 TableView 下移到最后一行。
(仅供参考,我不使用[self.tableView setContentOffset:CGPointMake(0, CGFLOAT_MAX)];
来向下滚动表格,因为它会引发异常)
ios8 可能有问题?
【问题讨论】:
【参考方案1】:viewDidLayoutSubviews 将完成这项工作
我猜你使用了一些自动布局或自动调整大小的单元格?在viewWillAppear
中,计算尚未完成。所以你滚动到底部,然后自动布局调整你的单元格的大小,使它们在高度上扩展。
详情:Refer to apple documentation UIViewController
...“您的视图控制器可以覆盖此方法以在视图布置其子视图后进行更改。此方法的默认实现不执行任何操作。”
- (void)viewDidLayoutSubviews
// your code here
【讨论】:
是的,你是对的,这可能是我使用自动布局的原因。但是我能做些什么来确定呢?除了viewWillAppear
还有其他方法可以试试吗?
也许你可以试试 viewDidAppear 但我不确定。应该有一些像 viewDidFinishedAutolayout 这样的事件。如果我能找到类似的东西,我会编辑我的答案。
不,很遗憾“viewDidFinishedAutolayout”不存在。我解决了使用“viewDidLayoutSubview”的问题,如下所示。
viewDidLayoutSubview 我认为这样做是个好主意。我误解了有关该方法的文档。但现在我认为它会起作用。感谢分享。【参考方案2】:
我用 reloadSection 方法添加了这个事件,现在表格滚动到最后。此外,我将“tableView”更改为“myTableView”,因为我读到最好为视图指定一个非默认名称(正如 Sapi 在他的回答 here 中所说)。
- (void)viewDidLayoutSubviews
[self.myTableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[self.myTableView numberOfRowsInSection:0]-1 inSection:0];
[self.myTableView scrollToRowAtIndexPath:indexPath
atScrollPosition:UITableViewScrollPositionBottom
animated:YES];
恕我直言,这件事非常马基雅维利。
【讨论】:
以上是关于滚动 UITableView 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
水平滚动 UITableView 的奇怪行为(在 Monotouch 中)
带有导航栏大标题的 UITableView 奇怪的滚动行为,顶部的弹跳效果在滚动到顶部时自动切断/生涩