【问题标题】:Strange behavior on scroll UITableView滚动 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 可能有问题?

【问题讨论】:

    标签: objective-c uitableview ios8 autolayout xcode6


    【解决方案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];
    }
    

    恕我直言,这件事非常马基雅维利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-15
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多