当CALayer处于暂停状态时更新位置是否有问题?

5

暂停时读取演示位置是否有问题?

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

这是我用来暂停和恢复CALayer的代码(基于由Apple提供的技术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
闪烁是什么意思?图层是消失然后突然出现,还是相对于暂停位置恢复时有偏移? - MiguelB
图层消失了,然后突然重新出现。 - haroldcampbell
1个回答

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会议424和425部分:实践中的核心动画

WWDC 2011会议421:核心动画基础知识

以及

开发者视频716会话:iPhone和Mac的核心动画技术


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接