首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CALayer动画问题

CALayer动画问题
EN

Stack Overflow用户
提问于 2013-09-17 20:05:45
回答 2查看 1.1K关注 0票数 0

我正在尝试动画不同的CALayers,但只有最后一个动画作品。

我这样做是为了创建包含文本的不同CALayers,并为每一个都添加动画。下面是生成CALayers的代码:

代码语言:javascript
复制
    // Create a layer for the title
    CALayer *_watermarkLayer = [CALayer layer];
    [_watermarkLayer setOpacity:0];

    // Create a layer for the text of the title.
    CATextLayer *titleLayer = [CATextLayer layer];
    titleLayer.string = text;
    titleLayer.foregroundColor = [color CGColor];
    titleLayer.shadowOpacity = 0.5;
    titleLayer.alignmentMode = kCAAlignmentCenter;
    titleLayer.bounds = CGRectMake(0, 0, videoSize.width/2, videoSize.height/2); 
    [_watermarkLayer addSublayer:titleLayer];

    // Fade in/out animation
    NSString* aux = [NSString stringWithFormat:@"%d", seconds];
    CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    fadeAnimation.fromValue = [NSNumber numberWithFloat:1.0];
    fadeAnimation.toValue = [NSNumber numberWithFloat:0.0];
    fadeAnimation.additive = YES;
    fadeAnimation.removedOnCompletion = YES;
    fadeAnimation.beginTime = seconds;
    fadeAnimation.duration = 2.0;
    fadeAnimation.fillMode = kCAFillModeRemoved; 
    [_watermarkLayer addAnimation:fadeAnimation forKey:[@"animateOpacity" stringByAppendingString:aux]];

我使用从上面的代码中获得的CALayer,如下所示:

代码语言:javascript
复制
- (void) addWatermarkWithVideoComposition:(AVMutableVideoComposition*)videoComposition withLabel:(NSString*)text andColor:(UIColor*)color andBeginTimeInSeconds:(int)seconds
{
    // Setup video layers
    CALayer *parentLayer = [CALayer layer];
    CALayer *videoLayer = [CALayer layer];
    parentLayer.frame = CGRectMake(0, 0, videoComposition.renderSize.width, videoComposition.renderSize.height);
    videoLayer.frame = CGRectMake(0, 0, videoComposition.renderSize.width, videoComposition.renderSize.height);
    [parentLayer addSublayer:videoLayer];

    // Create and add watermark layer
    CALayer *exportWatermarkLayer = [self watermarkLayerForSize:CGSizeMake(300, 300) andText:text andColor:color andBeginTimeInSeconds:seconds];
    exportWatermarkLayer.position = CGPointMake(videoComposition.renderSize.width/2, videoComposition.renderSize.height/4);
    [parentLayer addSublayer:exportWatermarkLayer];

    // Merge layers
    videoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer];
}

用法:

代码语言:javascript
复制
AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.instructions = instructions;
    videoComposition.renderSize = outputSize;
    videoComposition.frameDuration = CMTimeMake(1, 30);

    [self addWatermarkWithVideoComposition:videoComposition withLabel:@"Tag" andColor:lastColor andBeginTimeInSeconds:0];
    [self addWatermarkWithVideoComposition:videoComposition withLabel:@"Tag" andColor:lastColor andBeginTimeInSeconds:3];
    [self addWatermarkWithVideoComposition:videoComposition withLabel:@"Tag" andColor:lastColor andBeginTimeInSeconds:5];

AVAssetExportSession *exporter = [AVAssetExportSession exportSessionWithAsset:composition presetName:preset];
....................

我做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2013-11-20 02:05:10

据我所知,您的代码中有三个问题。您可能需要:

... = NO;.

  • Change fadeAnimation.removedOnCompletion = YES;更改为fadeAnimation.fillMode = xyz;,以便将您要导出的所有CALayers和所有CAAnimations的.beginTime与当前包含beginTime == 0.0的CAAnimations一起导出(这是默认值!!)转到AVCoreAnimationBeginTimeAtZero.

关于这一点的更多细节可以在苹果的AVVideoCompositionCoreAnimationTool文档中找到。

CAMediaTiming协议的beginTime属性的苹果文档中也没有提到beginTime提示,这是不好的。

我也遇到过类似的问题,只有那些动画有效,我显式地设置了一个(非零) beginTime。希望这也是你的问题的解决方案。

票数 0
EN

Stack Overflow用户

发布于 2017-04-23 19:37:45

我使用下面的代码来创建一个水印CALayer到视频的中心,它在osx Cocoa上工作。希望这能对你有所帮助。

代码语言:javascript
复制
- (CALayer *)createLayerImage:(NSString *)imagePath videoSize:(CGSize)videoSize
{
    CALayer *watermarkLayer = [CALayer layer];
    NSImage *watermarkImage = [[NSImage alloc] initWithContentsOfFile:imagePath];
    [watermarkLayer setContents:watermarkImage];
    [watermarkLayer setFrame:CGRectMake((videoSize.width-watermarkImage.size.width)/2,
                                        (videoSize.height-watermarkImage.size.height)/2,
                                        watermarkImage.size.width,
                                        watermarkImage.size.height)];
    NSLog(@"watermark layer %fx%f", watermarkImage.size.width, watermarkImage.size.height);
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.fromValue = [NSNumber numberWithFloat:1.0];
    animation.toValue = [NSNumber numberWithFloat:1.0];
    animation.removedOnCompletion = NO;
    animation.duration = 5.0;
    animation.repeatCount = 1;
    animation.beginTime = AVCoreAnimationBeginTimeAtZero;
    animation.fillMode = kCAFillModeForwards;
    [watermarkLayer addAnimation:animation forKey:@"opacity"];

    return watermarkLayer;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18849414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档