UIView重新出现时如何恢复动画?

Tra*_*ggs 2 core-animation uiview ios ios7

我有一个自定义UIView子类(ValveStatusView).它是一个放置在自定义'UITableViewCell subclass (ValveCell) . Upon receivingawakeFromNib inValveStatusView`中的子视图,我设置了一些子图层,其中一个是动画的.动画设置代码如下所示:

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(32, 64 + 6)];
    animation.duration = 0.75;
    animation.repeatCount = HUGE_VALF;
    animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn];
[drop addAnimation:animation forKey:@"position"];
Run Code Online (Sandbox Code Playgroud)

它使得"掉落"的图像永远地从水龙头反复掉落.这些单元格嵌入a UITableView,然后嵌入标签视图中.当我导航到另一个选项卡,然后返回时,我的动画不再运行了.我假设当包含我的视图的视图堆栈不再映射到窗口时,它会关闭动画.这是正确的假设吗?假设它是,当视图再次映射时,让它再次运行的惯用方法是什么?

我查看了这些UIView方法,但没有任何东西跳出来作为明显的"钩子"让它再次运行.我承认要浏览它们,而不是详尽地阅读它们.

Dav*_*nov 6

你应该在你的问题中提到包含动画层的视图是UITableViewCell的子类.:)因为,这实际上是动画停止的原因.UITableViewCell从其子图层中删除动画,以避免在从tableview中删除单元格以供以后重用时进行不必要的计算.要解决您的问题,您可以覆盖prepareForReuse单元格的方法并在那里重新启动动画.所以你应该做这样的事情:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // Initialization code

        // some initial setup here...

        [self addAnimation];
    }
    return self;
}

- (void)prepareForReuse {

    [super prepareForReuse];

    [self addAnimation];
}

- (void)addAnimation {

    // remove previous animations
    [drop removeAllAnimations];

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.toValue = [NSValue valueWithCGPoint:CGPointMake(32, 64 + 6)];
    animation.duration = 0.75;
    animation.repeatCount = HUGE_VALF;
    animation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn];
    [drop addAnimation:animation forKey:@"position"];
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.