我正在尝试创建一个相对简单的CoreAnimation,用于在AVComposition
中使用。我的目标是创建一个CALayer
,通过各种子层,淡入淡出标题,然后淡入淡出图像。基本上是幻灯片。这是使用AVAssetWriter
导出为.mov文件。
在WWDC 2011 AVEditDemo的帮助下,我已经能够让标题和图像出现了。问题是它们都同时出现在屏幕上!
我已经将每个图层的不透明度设置为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秒。正如标题所述,它们的淡出动画很好用。
非常感谢任何帮助!
干杯!
编辑
答案都很有用,但最终我发现只能向一个CALayer
添加一个动画。淡出动画能够工作是因为它是最后添加的。
所以我意识到
CAKeyframeAnimation
对此是最好的。但我现在也遇到了一些困难!代码现在可以淡入,但无法淡出。我尝试了各种fillMode,更改了持续时间等等。无法使其工作!!这是我的代码:
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];