1

这是一个奇怪的事实:

我有一个自定义 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];
}

如果你有什么想法...

非常感谢 !

4

2 回答 2

1

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

我能想到两种选择。

第一个是将根视图控制器设置为包含视图控制器并将其添加DWPlayerCellVCchildViewController. 此选项确实需要一些工作才能使其全部运行,我建议阅读创建自定义容器视图控制器以查看使其正常运行所需的知识。

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

于 2013-08-23T14:50:11.263 回答
0

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

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

于 2013-08-23T14:47:52.840 回答