CoreAnimation - Анимация затухания и исчезновения непрозрачности не работает - PullRequest
20 голосов
/ 03 января 2012

Я пытаюсь создать довольно простую CoreAnimation для использования в AVComposition.Моя цель состоит в том, чтобы создать CALayer, который с помощью различных подслоев постепенно исчезает, а затем исчезает в изображениях.Слайд-шоу, в основном.Это экспортируется в .mov с помощью AVAssetWriter.

С помощью AVEditDemo на WWDC 2011 я смог получить название и изображения.Проблема в том, что они все на экране одновременно!

Я создал каждый слой с непрозрачностью 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;

У исчезновения изображения в анимациях есть beginTime с интервалом в 5 секунд,Как и название, их анимация затухания работает отлично.

Любая помощь будет принята с благодарностью!

Приветствия!

РЕДАКТИРОВАТЬ

Все ответы были полезны, но в итоге я обнаружил, что только одна анимация может быть добавлена ​​к CALayer.Анимация затухания работала, так как была добавлена ​​последней.

Затем я попробовал CAAnimationGroup, но это не сработало, так как я изменял тот же путь значения ключа.

Так что я понял, что 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]; 

Ответы [ 11 ]

0 голосов
/ 26 мая 2017

Посмотрите на мой ответ https://stackoverflow.com/a/44204846/667483

В итоге: для использования beginTime вы должны установить fillMode на kCAFillModeBackwards для вашего объекта анимации.

...