Callback for UITableView animations

2019-01-25 20:31发布

Is there a delegate protocol that includes a callback for the end of animated changes to UITableView? Particularly reloadSection/Rows?

2条回答
Explosion°爆炸
2楼-- · 2019-01-25 20:33

Actually, there DOES seem to be a way to do this (though not nearly as straightforward as it ought to be!).

While there's no direct access to some kind of callback, it appears that UITableView animations take place within a CAAnimation. Therefore, simply accessing the completionBlock of the CAAnimation seems to give you what you want.

Here's how I got 2 animations to chain in my UITableView subclass:

#pragma mark - Section expanding/collapsing
- (void)toggleSection:(NSInteger)index {
    int expandedSection = [self ExpandedSection];
    if (expandedSection != NO_EXPANDED_SECTIONS_INDEX) {
        [self beginUpdates];
        [self collapseSection:@(expandedSection)];
        [CATransaction setCompletionBlock:^{
            if (expandedSection != index) {
                [self beginUpdates];
                [self expandSection:@(index)];
                [self endUpdates];
            }
        }];
        [self endUpdates];
    } else {
        [self expandSection:@(index)];
    }
}

The code in the collapseSection: and expandingSection: methods simply adds/removes sub-sections that need to be collapsed or expanded. The key point here, though, is that, when using this code, I am finally able to collapse one sub-section THEN expand the next sub-section. Before, both animations were occurring concurrently, which was visually unappealing.

I hope this helps you! I struggled through this for a long time, banging my head against the wall until I found this.

This is written against iOS 6.0. I also really hope that some future version makes this workaround/hack obsolete!

查看更多
混吃等死
3楼-- · 2019-01-25 20:59

It's not the answer you want to hear but no* :(

The table view's delegate will respond to these methods only.

However, (it's a bit of a hack but) animations are about 0.35 seconds long do you could just call performSelector:withObject:afterdelay: . . .

*at least not as far as I know . . .

查看更多
登录 后发表回答