UITableView内容大小何时更新为行插入/删除动画

时间:2013-07-13 22:04:35

标签: ios cocoa-touch uitableview

我很好奇在执行插入/删除动画调用后更新UITableView的内容大小。我认为它会像大多数[UIView动画...]块一样,即使动画没有完成,帧大小/内容大小也会立即更新,但它似乎不是这样。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

不幸的是,在从UITableView添加/删除行时,我还没有找到更新contentSize的好方法,但我确实找到了一种方法来计算如果你知道它的索引路径将是什么你要添加/删除的单元格。

使用已修改行的索引路径,可以使用tableView:heightForRowAtIndexPath:方法计算各个单元格的高度,并将其添加到表视图的当前内容大小高度。如果您只添加一行,这是一个示例:

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic];
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow];
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight

答案 1 :(得分:2)

看起来sizeThatFits()可以公开待处理的新contentSize的高度。然后,您可以指定该挂起的大小,以便及早解析滚动动画。

有这样的事情:

extension UIScrollView {

    var pendingContentSize: CGSize {
        var tallSize = contentSize
        tallSize.height = .greatestFiniteMagnitude
        return sizeThatFits(tallSize)
    }

    func scrollToBottom(animated: Bool) {
        contentSize = pendingContentSize
        let contentRect = CGRect(origin: .zero, size: contentSize)
        let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge)
        guard !bottomSlice.isEmpty else { return }
        scrollRectToVisible(bottomSlice, animated: animated)
    }

}

我能够像这样编写视图控制器代码:

tableView.insertRows(at: [newIndexPath], with: .none)
tableView.scrollToBottom(animated: true)

并让表格一直滚动到底部(使用新的内容大小),而不是向下滚动到倒数第二行(使用旧的内容大小)。

答案 2 :(得分:0)

在调用代表关于身高后,内容大小会发生变化:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;