UITableViewCell中的UIView动画只能工作一次



这里有一个奇怪的事实:

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

它可以很好地创建单元格。

但是,一旦我滚动到隐藏单元,然后返回到它,动画就停止了。我能理解。但我在视图中也调用了我的动画方法WillAppear。有线部分是调用该方法,我在其中放置了一个断点,没有任何内容被脱盐。。。

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

如果你有什么想法。。。

非常感谢!

问题似乎是因为zoomIn只会被setModel调用。这是因为UITabelViewCells不被期望管理显示UIViewControllers,因此viewWillAppear:将永远不会被调用。

我能想到两种选择。

第一种方法是将根视图控制器设置为包含视图控制器,并将DWPlayerCellVC添加为childViewController。这个选项确实需要一些工作来让它全部运行,我建议阅读《创建自定义容器视图控制器》,看看它是否需要运行。

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

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

尝试-放大之前,请确保它已缩小。因此,在ViewWillAppear中,快速"重置"单元格,然后调用zoomIn,看看这是否解决了问题。

最新更新