滚动 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 奇怪的滚动行为,顶部的弹跳效果在滚动到顶部时自动切断/生涩

UITableView 奇怪的行为

UITableView 在旋转时使用自动布局调整大小

UITableView 方法“indexPathForRowAtPoint:”的奇怪行为

UICollectionView 单元格高度/可滚动内容行为奇怪/不正确