iOS - 如何为可扩展的uitableviewcell的子视图设置动画

时间:2015-03-26 14:41:21

标签: ios objective-c iphone uitableview animation

当用户点击它时,我展开/取消展开tableviewcell。 我通过调用

来做到这一点
[tableview beginUpdates];
[tableview endUpdates];

此处描述http://locassa.com/animate-uitableview-cell-height-change/ 这将重新计算单元格的高度,而无需重新加载整个tableview。

我通常在

中布置我的自定义tableviewcells的子视图
- (void)layoutSubviews {
    _aTableViewCellSubView.frame = CGRectMake(0.f, 10.f, self.frame.size.width, 20.f);
    ...
}

我天真的方法是在自定义tableViewCell

中定义BOOL标志
initiallyLayedOut = NO;

如果此标志设置为NO,则设置不带动画的子视图; 在初始布局之后我会将其设置为YES,然后始终将子视图设置为新的位置/大小。 但这并没有真正起作用,因为layoutSubviews可能被多次调用(在我的例子中,在调整单元格大小之后,它被调用了4次)。

我是一位经验丰富的iOS开发人员,但我找不到解决这个问题的好方法......

欢呼声

2 个答案:

答案 0 :(得分:1)

将更改置于

之间
UITableViewCell *cell = [tableView cellforRow...]

[tableview beginUpdates];
cell.subview.frame = CGRectMake....
[tableview endUpdates];

它会动画

UITableViewCell *cell = [tableView cellforRow...]

[tableview beginUpdates];
[cell layoutSubviews];
[tableview endUpdates];

答案 1 :(得分:-1)

而不是在

中设置子视图的帧

- (void)layoutSubviews

我在

中这样做

- (void)setFrame(CGRect)frame

子视图现在可以为他们的新职位设置动画。 此外,您可以通过包装beginUpdates和endUpdates来控制动画持续时间,如下所示:

[UIView beginAnimations:@"myAnimationId" context:nil];
    [UIView setAnimationDuration:0.5];

    //scroll cell to visible after update animations finished
    [CATransaction begin];
    [CATransaction setCompletionBlock:^{
        [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        }
    }];

    [self.tableView beginUpdates];
    [self.tableView endUpdates];

    [CATransaction commit];
    [UIView commitAnimations];

欢呼声