0

我有一个包含相当复杂单元格的表格视图。该单元格包含一个按钮,当按下该按钮时,应展开该单元格并显示一些额外的控件。我认为这会很简单,所以我编写了以下代码(在我从 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例如更改框架,但表格更新总是会产生一些副作用。我还尝试在完成处理程序中链接比例更改,这当然也不起作用。我认为这是因为执行完成块时表格视图没有完成动画。

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

4

2 回答 2

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

这不完全是我试图创造的效果,但它是我能够得到的最接近的效果。我将其发布为答案,以防其他人遇到类似问题。

于 2013-01-31T19:49:42.307 回答
0

我有一个类似的问题,并且想通过基于选择的动画打开/关闭和更改单元格中的特定元素。

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

每个 tableviewcell 都有一个 open 和 close 方法,它执行背景颜色和大小的动画(除其他外)。

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

        }

    }
于 2014-04-08T08:26:15.730 回答