我的表视图中有一个相当复杂的单元格。单元格包括一个按钮,按下该按钮时,应该展开单元格并提供一些额外的控件。我认为这很简单,所以我编写了以下代码(在我的类中派生自UITableViewCell):
self.extraView = [[MyView alloc] initWithFrame:CGRectMake(0,100,300,200)];
self.extraView.clipsToBounds = YES;
[self addSubview:self.extraView];
self.extraView.transform = CGAffineTransformMakeScale(1, 0.1f);
[UIView animationWithDuration:0.5 animations:^{
[tableView beginUpdates];
[tableView endUpdates];
self.extraView.transform = CGAffineTransformIdentity;
}];
令人惊讶的是,这会使extraView
在屏幕上短暂闪烁然后消失。如果我删除了对beginUpdates
和endUpdates
的调用,那么extraView
将完全按照我的预期进行动画制作。但是,表格单元格不足以显示它。我尝试将alpha设置为0,然后在表更新期间将其淡入,这似乎工作正常。不幸的是,我应该让extraView
成长并且不会褪色。
我玩过各种修改extraView
的方式,例如更改框架,但是表格更新总会产生一些副作用。我也尝试在完成处理程序中链接比例更改,这当然也不起作用。我认为这是因为执行完成块时表视图没有动画完成。
有没有办法在表格更新期间为单元格中的视图框架设置动画?
答案 0 :(得分:0)
似乎答案是否定的。至少,在表视图更新期间修改视图框时,我没有找到任何看起来在视觉上正确的内容。我现在所做的是等待一段时间然后增加视图的框架。这就是代码的外观:
extraView.alpha = 0; // hide the view immediately after adding it
[tableView beginUpdates];
[tableView endUpdates];
[UIView animateWithDuration:0.5 animations:^{
button.alpha = 0; // fade out old button
} completion:^(BOOL finished) {
extraView.alpha = 1; // reappear, but not fading in
extraView.transform = CGAffineTransformMakeScale(1, 0.01f);
[UIView animateWithDuration:0.5 animations:^{
extraView.transform = CGAffineTransformIdentity; // animate scale back to original size
}];
}];
这不是我试图创造的效果,但它是我能够得到的最接近的效果。我发布它作为答案,以防其他人遇到类似的问题。
答案 1 :(得分:0)
我有一个类似的问题,并希望根据选择打开/关闭并更改单元格中的特定元素。
我首先为uitableviewcell创建了一个子类。
每个tableviewcell都有一个open和close方法,可以制作backgroundcolor和大小的动画(以及其他内容)。
tableviewcell的open和close方法如下所示:
- (void)open {
[UIView animateWithDuration:0.3
animations:^{
[self.customBackgroundView setHeight:76];
self.deleteButton.alpha = 1;
self.selectedIndicator.transform = CGAffineTransformMakeRotation(M_PI);
[self.selectedIndicator setY:60];
}
];
}
- (void)close {
[UIView animateWithDuration:0.3
animations:^{
[self.customBackgroundView setHeight:40];
self.deleteButton.alpha = 0;
self.selectedIndicator.transform = CGAffineTransformMakeRotation(0);
[self.selectedIndicator setY:24];
}
];
}
它还有一个setSelected方法,因此当选择单元格时,它会打开:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
if (selected) {
[self open];
} else {
[self close];
}
}
现在,唯一剩下的就是确保在选中此单元格时关闭其他单元格。 并调用tableview beginUpdates和tableview endUpdates:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (_currentSelection == indexPath.row) {
_currentSelection = -1;
SOColumnTableViewCell *cell = (SOColumnTableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
[cell close];
} else {
_currentSelection = (int)indexPath.row;
}
[tableView beginUpdates];
[tableView endUpdates];
}
}