我正在尝试创建一个相当简单的CoreAnimation,用于 AVComposition
. 我的目标是创建一个 CALayer
,它通过各种子层淡入淡出 Headers ,然后淡出图像 . 幻灯片,基本上 . 这是使用 AVAssetWriter
导出到.mov .
在WWDC 2011 AVEditDemo的帮助下,我已经能够获得一个 Headers 和图像 . 问题是它们同时都在屏幕上!
我创建了每个图层的不透明度为0.0 . 然后我添加了一个 CABasicAnimation
,使用以下代码将它们从0.0淡化为1.0:
CABasicAnimation *fadeInAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
fadeInAnimation.fromValue = [NSNumber numberWithFloat:0.0];
fadeInAnimation.toValue = [NSNumber numberWithFloat:1.0];
fadeInAnimation.additive = NO;
fadeInAnimation.removedOnCompletion = YES;
fadeInAnimation.beginTime = 1.0;
fadeInAnimation.duration = 1.0;
fadeInAnimation.fillMode = kCAFillModeForwards;
[titleLayer addAnimation:fadeInAnimation forKey:nil];
问题似乎是'beginTime'属性 . “1.0”意味着延迟,因此它在动画开始后1秒开始 . 但是,它会立即出现在屏幕上 . 淡出动画
对于淡出,此代码的反向只是将fromValue更改为1.0,将toValue更改为0.0 . 它的开始时间为4.0,完美运行 .
我正在使用以下内容创建 animatedTitleLayer
:
CATextLayer *titleLayer = [CATextLayer layer];
titleLayer.string =self.album.title;
titleLayer.font = @"Helvetica";
titleLayer.fontSize = videoSize.height / 6;
titleLayer.alignmentMode = kCAAlignmentCenter;
titleLayer.bounds = CGRectMake(0, 0, videoSize.width, videoSize.height / 6);
titleLayer.foregroundColor = [[UIColor redColor]CGColor];
titleLayer.opacity = 0.0;
动画中的图像淡入时间相差5秒 . 就像 Headers 一样,它们的淡出动画效果很好 .
任何帮助将不胜感激!
干杯!
EDIT
答案都很有帮助,但最终我发现只有一个动画可以添加到 CALayer
. 淡出动画正在运行,因为它是最后添加的动画 .
然后我尝试了CAAnimationGroup,但这不起作用,因为我修改了相同的键值路径 .
所以我意识到 CAKeyframeAnimation
是最好的 . 只有我逐渐消失 . 我've tried various fillMode' s,改变了持续时间等等 . 不能让它工作!!
这是我的代码:
CAKeyframeAnimation *fadeInAndOut = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
fadeInAndOut.duration = 5.0;
fadeInAndOut.autoreverses = NO;
fadeInAndOut.keyTimes = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:1.0],
[NSNumber numberWithFloat:4.0],
[NSNumber numberWithFloat:5.0], nil];
fadeInAndOut.values = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0],
[NSNumber numberWithFloat:1.0],
[NSNumber numberWithFloat:1.0],
[NSNumber numberWithFloat:0.0], nil];
fadeInAndOut.beginTime = 1.0;
fadeInAndOut.removedOnCompletion = NO;
fadeInAndOut.fillMode = kCAFillModeBoth;
[titleLayer addAnimation:fadeInAndOut forKey:nil];
11 回答
我遇到了同样的问题,问题是 - 一层不能包含淡入淡出 . 所以你可以像我一样将其他动画添加到父图层
男人,这么多复杂的答案 . 最简单的方法就是添加自动反转 . 瞧 .
这对我有用:
尝试:
我想你正在寻找
timeOffset
,而不是beginTime
......问题的核心是没有理解CAKeyframeAnimation的keyTimes属性 . 这个问题澄清了一切,让我走上了正确的道路:
What kind of value is keyTime in an CAKeyFrameAnimation?
借用gamblor87提到的链接并添加我的评论作为解释 .
LenK的答案对我来说非常合适 . 如果有人有兴趣,我会为Obj-C重写(注意我也略微更改了淡入的关键帧):
重点是关键名称 . 您必须设置不透明度键 .
检查示例代码 . 我在Swift 4中测试过
另一种方法是使用CAAnimationGroup . CAKeyframeAnimation也适用于UI . 此代码在UI中可以很好地实时显示动画 . 但 will not work at all 在
AVVideoCompositionCoreAnimationTool
- 如果需要,请向下滚动 . 它不是代码准备好复制粘贴,但你可以得到这个想法 . 此外,您还可以向该组添加其他动画:这里有关于
AVVideoCompositionCoreAnimationTool
层的动画的小注释 . 您可以看到相关的gif图像( Headers 应该一个接一个地出现和消失) . 为了解决这个问题,我使用了2个单独的CALayer
,因为出于某种原因,在一个图层2上多个图层上的动画都是glitched .最后,我们可以获得适当的动画序列
看看我的回答https://stackoverflow.com/a/44204846/667483
总结:要使用
beginTime
,您应该在动画对象上将fillMode设置为kCAFillModeBackwards
.