2010-07-15 4 views
3

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

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

[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.

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

ответ

3

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

+2

Если вы хотите, чтобы изменить мгновенно, а не гаснуть, вы можете CAKeyframeAnimation с помощью 'значение kCAAnimationDiscrete' для' calculationMode'. Вы также должны установить свойство 'fillMode'' kCAFillModeBoth'. –

+0

Спасибо, я обязательно посмотрю на это, но есть ли причина, почему то, что я делаю в данный момент, не работает? Просто для удовлетворения моего любопытства :) –

+0

Использование opacity ничего не изменило, к сожалению. Слой скрывается/становится прозрачным сразу, полностью игнорируя анимацию.Мой метод делегирования для анимацииDidStop также вызывается немедленно, даже если моя продолжительность составляет примерно 100 секунд (только для целей тестирования). –

3

От CAMediaTiming.h, это говорит о BeginTime собственности:

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

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

[hideAnimation setBeginTime:CACurrentMediaTime() + 0.09]; 
+1

Действительно полезные советы, но когда анимация закончена, значение непрозрачности возвращается к исходному. Как я могу это исправить? Спасибо! Богдан. – Bogdan

3

Я уверен, что это слишком поздно, чтобы сделать оригинальный плакат хорошим, но он может помочь другим. Я пытался сделать что-то подобное, за исключением того, чтобы сделать анимацию неявной при изменении свойства 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; 

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

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

0
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]; 
Смежные вопросы