在UITableView更新期间可以对UIView框架进行动画制作吗?

时间:2013-01-28 20:03:32

标签: iphone uitableview animation

我的表视图中有一个相当复杂的单元格。单元格包括一个按钮,按下该按钮时,应该展开单元格并提供一些额外的控件。我认为这很简单,所以我编写了以下代码(在我的类中派生自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在屏幕上短暂闪烁然后消失。如果我删除了对beginUpdatesendUpdates的调用,那么extraView将完全按照我的预期进行动画制作。但是,表格单元格不足以显示它。我尝试将alpha设置为0,然后在表更新期间将其淡入,这似乎工作正常。不幸的是,我应该让extraView成长并且不会褪色。

我玩过各种修改extraView的方式,例如更改框架,但是表格更新总会产生一些副作用。我也尝试在完成处理程序中链接比例更改,这当然也不起作用。我认为这是因为执行完成块时表视图没有动画完成。

有没有办法在表格更新期间为单元格中的视图框架设置动画?

2 个答案:

答案 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];

        }

    }