在图层暂停时更新CALayer位置是否存在问题?

时间:2011-05-07 04:01:24

标签: iphone objective-c animation core-animation calayer

在暂停时阅读演示文稿位置是否存在问题?

我正在尝试暂停并恢复CALayer。暂停CALayer后,我想用它的当前演示位置更新图层的位置。 当我尝试这样做时,一旦我恢复图层,图层会稍微闪烁。

这是我用来暂停和恢复CALayer的代码(基于Apple提供的Technical Q&A QA1673):

CFTimeInterval pausedTime;
void pauseLayer(CALayer *layer)
{
    pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
    layer.speed = 0.0;
    layer.timeOffset = pausedTime;
    layer.beginTime = 0;
//    layer.position = ((CALayer*)[layer presentationLayer]).position;
}
void resumeLayer(CALayer *layer)
{
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = 0.0;

    CFTimeInterval _elapsedTimeSincePaused = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
    layer.beginTime = _elapsedTimeSincePaused;
}

如果我取消注释layer.position = ((CALayer*)[layer presentationLayer]).position;中的pauseLayer,则在调用resumeLayer后,图层会闪烁。

这是我的动画代码:

- (void) startAnimation:(id)sender
{
    layer10Animation = [CABasicAnimation animationWithKeyPath:@"position.x"];
    layer10Animation.duration = 1;
    layer10Animation.toValue = [NSNumber numberWithInt:300];
    layer10Animation.fromValue = [NSNumber numberWithInt:20];
    layer10Animation.repeatCount = 100;
    layer10Animation.autoreverses = YES;

    [layer10 addAnimation:layer10Animation forKey:nil];
}

祝你好运

1 个答案:

答案 0 :(得分:3)

在暂停时更新CALayer位置没有问题。然而,它自然会给你提到的闪烁。那是因为你正在更新图层在动画中的位置。

不要忘记创建CABasicAnimation并将其添加到CALayer不会更改图层的设置。它使用图层创建动画,但它不会更改图层。

这就是为什么动画结束后,你会看到图层回到原来的位置。

因此,如果您要将图层从A设置为B,如果您希望在动画完成后图层显示在B,则需要此委托回调:

- (void)animationDidStart:(CAAnimation *)theAnimation
{ 
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];
    myLayer.position = targetPosition;    
    [CATransaction commit];
}
是的,它是animationDidStart。如果我们使用animationDidStop来做,那么您会看到另一个闪烁。该图层将位于B的动画结束位置,然后您会在A处看到它的闪烁,然后您再次在B处看到它。

使用animationDidStart我们将位置设置为targetPosition,即B,因为我们希望在完成时看到它。

现在,关于QA1673,您正在做的是将动画速度设置为零,并获取当前CACurrentMediaTime()的时间戳。在恢复时,您将速度恢复正常,并应用暂停时间内产生的任何偏移。

这一切看起来都很混乱,直到你掌握了它。我可以推荐一些阅读和视频吗?

绝对读取Core Animation Rendering Architecture

强烈推荐的视频是:

WWDC 2010 Sessions 424 and 425 Core Animation in Practice Parts 1 and 2

WWDC 2011 Session 421 Core Animation Essentials

Developer Videos Session 716 Core Animation Techniques for iPhone and Mac