UITableViewCell中的UIView动画只能运行一次

时间:2013-08-23 14:33:18

标签: ios animation uitableview

这是一个奇怪的事实:

我有一个自定义的UITableViewCell,其中我有一个动画(图像移动)。

它在创建单元格时工作正常。

但是一旦我滚动隐藏单元格然后再返回它,动画就停止了。那,我能理解。但我也在我的viewWillAppear中调用我的动画方法。有线部分是调用该方法,我在其中放置了一个断点,没有任何内容被解除分配......

我的UITableViewCell保持强烈(其中有一个音乐播放器,音乐继续播放)。我真的不明白。

这是我的代码:

@property (nonatomic, strong) DWPlayerCellVC *playerView;


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"player"];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"player"];
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        NSArray *viewsToRemove = [cell.contentView subviews];
        for (UIView *v in viewsToRemove) {
            [v removeFromSuperview];
        }

        if(!self.playerView){
            self.playerView = [[DWPlayerCellVC alloc] init];
        }

        [cell.contentView addSubview:self.playerView.view];

        self.playerView.model = self.model[indexPath.row];


        return cell;

DWPlayerCellVC:

@implementation DWPlayerCellVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

}

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self zoomIn];
}

- (void)setModel:(id)model
{
    _model = model;
     // ...
    [self zoomIn];

}

- (void)zoomIn
{
    UIViewAnimationOptions options =
    UIViewAnimationOptionBeginFromCurrentState |
    UIViewAnimationOptionCurveEaseInOut |
    UIViewAnimationOptionRepeat |
    UIViewAnimationOptionAutoreverse;

    [UIView
     animateWithDuration:10.f
     delay:0.f
     options:options
     animations:^{
         CGFloat scale = 1.4f;
         self.imageCoverView.transform = CGAffineTransformMakeScale(scale, scale);
     } completion:NULL];
}

如果您有任何想法......

非常感谢!

2 个答案:

答案 0 :(得分:1)

看起来问题是因为zoomIn只会被setModel调用。这是因为预计UITabelViewCells不会显示UIViewControllers,因此永远不会调用viewWillAppear:

我可以想到两种选择。

第一种方法是将根视图控制器设置为包含视图控制器,并将DWPlayerCellVC添加为childViewController。这个选项确实需要一些工作才能使它全部运行,我建议阅读Creating Custom Container View Controllers以查看使其运行所需的工作。

第二个(也就是我将使用的那个)将创建一个处理运行动画的UITableViewCell子类。然后,您可以实现方法prepareForReuse以重新启动动画。当您使用dequeueReusableCellWithIdentifier:时,会在单元格上自动调用该方法。

答案 1 :(得分:0)

你的UITableViewCell会记住以前的状态。当它被放入队列时(当它滚出视图时),它不会恢复到原始状态。当你调用ZoomIn方法时,我认为正在发生的事情是它再次放大,但你无法分辨,因为已经放大了

尝试 - 在放大之前,确保它已缩小。所以在ViewWillAppear中,快速“重置”Cell,然后调用zoomIn,看看是否能解决问题。