Animate CALayer hide - PullRequest
       9

Animate CALayer hide

4 голосов
/ 16 июля 2010

Я пытаюсь скрыть CALayer через несколько микросекунд и использую CABasicAnimation для анимации скрытия.

В данный момент я пытаюсь использовать

[aLayer setHidden:YES];

CABasicAnimation * hideAnimation = [CABasicAnimation animationWithKeyPath:@"hidden"];
[hideAnimation setDuration:aDuration];
[hideAnimation setFromValue:[NSNumber numberWithBool:NO]];
[hideAnimation setToValue:[NSNumber numberWithBool:YES]];
[hideAnimation setBeginTime:0.09];
[hideAnimation setRemovedOnCompletion:NO];
[hideAnimation setDelegate:self];

[alayer addAnimation:hideAnimation forKey:@"hide"];

Но когда я запускаю это, слой сразу скрывается, а не ждет нужного beginTime.

Я не уверен в том, что мой keyPath является "скрытым", но не смог найти никакой другой опции, и в документации действительно указано, что свойство hidden для CALayer является анимируемым.

Как правильно достичь того, что я ищу?

Ответы [ 5 ]

3 голосов
/ 17 ноября 2010

В CAMediaTiming.h говорится о свойстве beginTime:

Время начала объекта относительно его родительского объекта, если применимо.По умолчанию 0.

Вы должны использовать CACurrentMediaTime () + желаемое смещение времени.

[hideAnimation setBeginTime:CACurrentMediaTime() + 0.09];
3 голосов
/ 18 декабря 2013

Я уверен, что уже слишком поздно, чтобы сделать оригинальный постер хорошим, но он может помочь другим. Я пытался сделать что-то подобное, кроме как сделать неявную анимацию при изменении свойства hidden. Как говорит Том, анимация opacity в этом случае не работает, так как изменение скрытого свойства слоя, кажется, сразу же вступает в силу (даже если я задерживаю анимацию с beginTime).

Стандартное неявное действие использует переход с постепенным исчезновением (CATransition, type = kCATransitionFade), но это действует на весь слой, и я хочу одновременно выполнить другую анимацию, которая не является совместимой операцией.

После долгих экспериментов я наконец заметил комментарий @ Кевина выше и --- привет! --- это на самом деле работает! Поэтому я просто хотел назвать это, чтобы решение было более заметным для будущих искателей:

CAKeyframeAnimation* hiddenAnim = [CAKeyframeAnimation animationWithKeyPath:@"hidden"];
hiddenAnim.values = @[@(NO),@(YES)];
hiddenAnim.keyTimes = @[@0.0, @1.0];
hiddenAnim.calculationMode = kCAAnimationDiscrete;
hiddenAnim.duration = duration;

Это задерживает скрытие до конца продолжительности. Объедините его с другими анимациями свойств в группе, чтобы их эффекты были видны до исчезновения слоя. (Вы можете комбинировать это с анимацией непрозрачности, чтобы слой исчезал при выполнении другой анимации.)

Спасибо, Кевин!

3 голосов
/ 16 июля 2010

Попробуйте вместо этого анимировать свойство непрозрачности. Перейдите от 1,0 до 0,0, и вы получите желаемый эффект.

1 голос
/ 11 июня 2018

Свифт 4

    let keyframeAnimation = CAKeyframeAnimation(keyPath: "hidden")
keyframeAnimation.calculationMode = kCAAnimationDiscrete
keyframeAnimation.repeatCount = 1.0
keyframeAnimation.values = [true, false,true,false,true]
keyframeAnimation.keyTimes = [0.0, 0.25,0.5,0.75, 1.0]
keyframeAnimation.duration = 30.0 //duration of the video in my case
keyframeAnimation.beginTime = 0.1
keyframeAnimation.isRemovedOnCompletion = false
keyframeAnimation.fillMode = kCAFillModeBoth

textLayer.add(keyframeAnimation, forKey:  "hidden")
0 голосов
/ 14 апреля 2017
    CABasicAnimation *endAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    endAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    [endAnimation setFromValue:[NSNumber numberWithFloat:1]];
    [endAnimation setToValue:[NSNumber numberWithFloat:0.0]];
    [endAnimation setBeginTime:AVCoreAnimationBeginTimeAtZero];
    endAnimation.duration            = 5;
    endAnimation.removedOnCompletion = NO;
    [alayer addAnimation:endAnimation forKey:nil];
...