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

har*_*ell 6 iphone animation core-animation objective-c calayer

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

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

这是我用来暂停和恢复的代码CALayer(基于Apple提供的技术问答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;
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释layer.position = ((CALayer*)[layer presentationLayer]).position;in 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];
}
Run Code Online (Sandbox Code Playgroud)

最好的祝福

Max*_*eod 3

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

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

这就是为什么动画完成后,您会看到图层回到之前的位置。

因此,如果您要对某个图层从 A 到 B 进行动画处理,并且希望该图层在动画完成后出现在 B 处,则需要此委托回调:

- (void)animationDidStart:(CAAnimation *)theAnimation
{ 
    [CATransaction begin];
    [CATransaction setValue:(id)kCFBooleanTrue
                     forKey:kCATransactionDisableActions];
    myLayer.position = targetPosition;    
    [CATransaction commit];
}
Run Code Online (Sandbox Code Playgroud)

是的,是animationDidStart。如果我们使用它,animationDidStop那么您会看到另一个闪烁。该图层将位于动画的结束位置 B,然后您会在 A 处看到它闪烁,然后您会在 B 处再次看到它。

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

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

在您掌握窍门之前,这一切似乎都很令人困惑。我可以推荐一些阅读材料和视频吗?

一定要阅读《核心动画渲染架构》

强烈推荐的视频有:

WWDC 2010 第 424 和 425 场核心动画实践第 1 部分和第 2 部分

WWDC 2011 第 421 场核心动画要点

开发者视频会议 716 适用于 iPhone 和 Mac 的核心动画技术