这里有一个奇怪的事实:
我有一个自定义的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,看看这是否解决了问题。