如何为 CALayer 使用基于块的动画?

Posted

技术标签:

【中文标题】如何为 CALayer 使用基于块的动画?【英文标题】:How to use block based animation for a CALayer? 【发布时间】:2015-09-12 01:38:32 【问题描述】:

我尝试使用 UIView 的块动画无限地脉冲渐变从透明到不透明。最终结果是渐变保持完全不透明,没有动画。甚至可以使用块样式为 CALayer 设置动画还是必须使用老式的一系列语句?

_pulsingLight = [CAGradientLayer layer];
_pulsingLight.colors = @[(id)([UIColor colorWithWhite:1.0 alpha:kPulsingLightStartAlpha].CGColor),
                         (id)([UIColor colorWithWhite:1.0 alpha:kPulsingLightStopAlpha].CGColor)];
_pulsingLight.opacity = 0.0;
[self.layer insertSublayer:_pulsingLight below:_anotherView.layer];
[UIView animateWithDuration:kPulsingLightHalfLife
                      delay:0.0
                    options:UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse
                 animations:^
                   _pulsingLight.opacity = 1.0;
                 
                 completion:nil];

【问题讨论】:

【参考方案1】:

UIView 具有基于块的动画。 CALayers 没有。您必须使用各种形式的 CAAnimation 来为 CALayer 设置动画。

也就是说,我相信您可以将更改提交到 UIView 动画块内的视图的主要支持层。

除了视图的支持层之外的 CALayers 不能使用 UIView 块动画进行动画处理,但它们确实支持许多属性的“隐式动画”。如果您更改不是视图支持层的图层的可动画属性,系统会使用默认动画设置(时间和步调)应用该更改。您可以使用 CATransaction 调用来更改那些隐式动画的设置,或者在没有动画的情况下进行更改。

【讨论】:

以上是关于如何为 CALayer 使用基于块的动画?的主要内容,如果未能解决你的问题,请参考以下文章

调试 Firebase 崩溃报告 - CALayer 位置包含 NAN

Swift:如何为 CALayer 启用捏合缩放功能?

如何为多个属性创建 CABasicAnimation?

动画期间无法获取 CALayer 的当前位置

iOS核心动画Core Animation

UIView:如何用阴影为 CALayer 框架设置动画?