CALayer“内容”属性上的隐式动画

Posted

技术标签:

【中文标题】CALayer“内容”属性上的隐式动画【英文标题】:Implicit animation on CALayer "contents" property 【发布时间】:2013-07-19 10:52:26 【问题描述】:

根据核心动画文档,设置图层内容应触发隐式 0.25 动画,该动画将在新旧图像之间转换。 我还看到很多地方人们都在问如何删除这个隐式动画,但由于某种原因,当我在我的项目中尝试这个时,我会立即交换图像。 在文档中阅读了更多内容,我看到这段代码被剪断了:

- (id<CAAction>)actionForLayer:(CALayer *)theLayer
                        forKey:(NSString *)theKey 
    CATransition *theAnimation=nil;

    if ([theKey isEqualToString:@"contents"]) 

        theAnimation = [[CATransition alloc] init];
        theAnimation.duration = 1.0;
        theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        theAnimation.type = kCATransitionPush;
        theAnimation.subtype = kCATransitionFromRight;
    
    return theAnimation;

这意味着“内容”不是隐式动画。

我很想更好地理解这一点。

【问题讨论】:

你有什么不明白的? 它应该是动画的吗?如果没有,为什么我看不到这个? 如果您明确地使用该过渡制作动画,它会起作用吗? @EyalRedler 它确实是隐式动画,尽管它可能很难看到。这不起作用的最常见原因是其内容更改的图层由 UIView 支持。在这种情况下,隐式图层动画被禁用。如果不是这种情况,请显示您正在使用的不隐式动画的代码。 【参考方案1】:

好的,我正在从我的应用程序中复制一些代码。首先,我通常不是使用 alloc..init.. 而是使用 +animation 来获取 CATransition。其次,我没有看到您正在向图层添加过渡。第三,我不确定 CATransition 是隐式动画的,CALayer 属性是的。

CATransition *transition = [CATransition animation];
    transition.duration = 1;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionPush;
    transition.subtype = slideCATransitionCompareTable[ arc4random() % 4]; //to get a random subtype 
    [self.slideShowReceiptImageView.layer addAnimation:transition forKey:nil];

【讨论】:

该动作没有显式添加到图层,因为它是在actionForLayer:forKey:内部创建的 好点,不知道。方法 'actionForLayer:forKey:' 是协议 CALayerDelgate 的委托方法,你是对的.. 谢谢!这是我可以实现“内容”动画的唯一方法。

以上是关于CALayer“内容”属性上的隐式动画的主要内容,如果未能解决你的问题,请参考以下文章

iOS边练边学--CALayer,非根层隐式动画,钟表练习

使用 Swift3 子类化 CALayer + 隐式动画

CALayer3-层的属性

隐式动画和核心动画

选择性地覆盖 CALayer 隐式动画

ios隐式动画