1

所以我有一个包含 3 个不同部分的表格视图,一旦单击其中一个部分,就会从该部分中下拉一组单元格。现在我试图让表格视图滚动到每个部分的最后一个单元格。到目前为止,我已经想出了这个:

[atableView beginUpdates];

    [atableView insertRowsAtIndexPaths:indexPathToInsert withRowAnimation:insertAnimation];
    [atableView setContentOffset:CGPointMake(0, self.view.bounds.size.height)];
    [atableView deleteRowsAtIndexPaths:indexPathsToDelete withRowAnimation:deleteAnimation];

    [atableView endUpdates];

   self.openSectionIndex = section;

因此,当我使用这种方法时,它会像我想要的那样向上移动整个视图,但是一些顶部单元格被切断并隐藏在它们从其下拉的部分下方。我可能调用这个方法太早了,它在行完成动画之前调用,或者它们在该部分下弹回。我可以下拉表格视图,然后单元格从该部分下方出来。有任何想法吗?

4

1 回答 1

0

我实现了一个可折叠的部分组件,就像您所描述的那样,并且可能为您提供解决方案。

我的实现在TLIndexPathTools库中。尝试运行“折叠”示例项目。展开第一部分。然后展开部分部分。您会看到,当单元格动画时,表格会滚动以在屏幕上显示尽可能多的部分。

这样做的诀窍是要意识到您需要滚动到一个不一定存在的位置,因为表格视图直到该过程稍后的某个时间才会重新计算它的内容大小。我使用的解决方案是将表格视图显式设置为contentSize包含您要滚动到的位置的值。我的实现如下所示:

/*
 Force table to scroll to the specified location even if it is beyond the current
 content area. Use this to scroll to a future location during animiated table updates
 with the assumption that the location will be valid after the updates.
 */
- (void)forceTableScrollBasedOnExpectedSize:(CGFloat)scrollLocation animated:(BOOL)animated
{
    CGSize expectedMinimumContentSize = self.tableView.contentSize;
    if (expectedMinimumContentSize.height < scrollLocation) {
        // Temporarily expand the content area to contain the scroll location.
        // The table will overwrite this during the update process.
        expectedMinimumContentSize.height = scrollLocation;
        self.tableView.contentSize = expectedMinimumContentSize;
    }
    [self.tableView scrollRectToVisible:CGRectMake(0, scrollLocation-1, 1, 1) animated:animated];
}

scrollLocation您要使其可见的最底部位置在哪里。您可以查看更多详细信息如何使用它UITableViewController+ScrollOptimizer.m

我不确定这是否适用于您的问题。如果没有,请在您的问题中详细说明。

于 2013-10-30T17:05:11.377 回答