当用户点击它时,我展开/取消展开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开发人员,但我找不到解决这个问题的好方法......
欢呼声
答案 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];
欢呼声