Iphone UIView帧是否可以在UITableView更新期间设置动画?

Iphone UIView帧是否可以在UITableView更新期间设置动画?,iphone,uitableview,animation,Iphone,Uitableview,Animation,我有一个带有相当复杂单元格的表视图。该单元格包括一个按钮,按下该按钮时,应展开单元格并显示一些额外的控件。我认为这将非常简单,因此我编写了以下代码(在我的类中,该类派生自UITableViewCell): 令人惊讶的是,这使得extraView在屏幕上短暂闪烁,然后消失。如果我删除对beginUpdates和endUpdates的调用,则extraView将完全按照我的预期设置动画。但是,表格单元格不够大,无法显示它。我尝试将alpha设置为0,然后在表更新期间淡入,这似乎很好。不幸的是,我应该

我有一个带有相当复杂单元格的表视图。该单元格包括一个按钮,按下该按钮时,应展开单元格并显示一些额外的控件。我认为这将非常简单,因此我编写了以下代码(在我的类中,该类派生自UITableViewCell):

令人惊讶的是,这使得
extraView
在屏幕上短暂闪烁,然后消失。如果我删除对
beginUpdates
endUpdates
的调用,则
extraView
将完全按照我的预期设置动画。但是,表格单元格不够大,无法显示它。我尝试将alpha设置为0,然后在表更新期间淡入,这似乎很好。不幸的是,我应该让
extraView
在适当的位置生长,而不是褪色

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


在表格更新过程中,有没有办法在单元格中设置视图帧的动画?

答案似乎是否定的。至少,我没有发现在表格视图更新过程中修改视图帧时在视觉上正确的东西。我现在做的是等待一点,然后增加视图的帧。下面是代码的外观:

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
    }];
}];

这并不完全是我试图创造的效果,但这是我所能得到的最接近的效果。我把它作为一个答案,以防其他人遇到类似的问题。

我也有类似的问题,希望根据选择通过动画打开/关闭并更改单元格中的特定元素

为此,我首先为uitableviewcell创建了一个子类

每个tableviewcell都有一个“打开”和“关闭”方法,用于制作背景颜色和大小(以及其他内容)的动画

tableviewcell的打开和关闭方法如下所示:

- (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开始更新和tableview结束更新:

   - (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];

        }

    }
   - (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];

        }

    }