2013-05-17 2 views
1

я оживляющий непрозрачности-свойство а CALayer с помощью следующего кода:CALayer CABasicAnimation цепочки

Создание анимации в методе:

+ (CABasicAnimation *)fadeIn:(float)begin duration:(float)duration remove:(BOOL)remove{ 

    CABasicAnimation *fadeAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"]; 
    fadeAnimation.fromValue = [NSNumber numberWithFloat:0.0]; 
    fadeAnimation.toValue = [NSNumber numberWithFloat:1.0]; 
    fadeAnimation.additive = NO; 
    fadeAnimation.removedOnCompletion = remove; 
    fadeAnimation.beginTime = begin; 
    fadeAnimation.duration = duration; 
    fadeAnimation.fillMode = kCAFillModeBoth; 

    return fadeAnimation; 
} 

Добавление анимации к слою:

[overlayLayer addAnimation:[VideoComposerHelpers fadeIn:1.0 duration:0.5 remove:NO] forKey:nil]; 

Это работает идеально. Однако теперь я хочу добавить еще одну анимацию к тому же слою сразу после завершения первой анимации.

[overlayLayer addAnimation:[VideoComposerHelpers fadeOut:1.5 duration:0.5 remove:NO] forKey:nil]; // fadeOut is a method similar to fadeIn 

Что должно случиться, слой выцветает с длительностью 0,5 и сразу после этого, она исчезает с длительностью 0,5. Это, похоже, не работает. Это потому, что начальная точка второй анимации такая же, как и конечная точка первого?

ответ

6

Вы должны использовать CAAnimationGroup что-то вроде этого:

CABasicAnimation *fadeIn = [VideoComposerHelpers fadeIn:1.0 duration:0.5 remove:NO]; 
CABasicAnimation *fadeOut = [VideoComposerHelpers fadeOut:1.5 duration:0.5 remove:NO]; 

CAAnimationGroup *group = [CAAnimationGroup animation]; 
group.fillMode = kCAFillModeForwards; 
group.removedOnCompletion = NO; 
[group setAnimations:[NSArray arrayWithObjects:fadeIn, fadeOut, nil]]; 
group.duration = 2; 
[overlayLayer addAnimation:group forKey:@"savingAnimation"]; 

Также я не уверен, если я получаю правильные значения начала VOR, конец, продолжительность анимации (вы должны проверить их) :)) ,

+0

Рад, что смог помочь , Я надеюсь, что тот, кто проголосовал за аргумент, может быть, это что-то не так в моем ответе (во всяком случае, я просто скопирую часть моего кода запуска, и я настроился в соответствии с вашими потребностями), поэтому в основном это должно быть хорошим ответ :)) – danypata

1

A CABasicAnimation может иметь делегата. Делегат будет отправлен animationDidStop:finished:. Теперь вы можете запросить следующую анимацию в цепочке.

В вашем случае, тем не менее, вам это даже не нужно; просто используйте анимацию, где autoreverses есть ДА.

(О, и не связывайтесь с removedOnCompletion и fillMode,.. Это просто неправильно, и примеры, которые используют их одинаково неправильно Они нужны только в середине сложных сгруппированных анимации)

+0

Вот раздел в моей книге о CABasicAnimation, а в следующем разделе рассказывается, как правильно его использовать: http://www.apeth.com/iOSBook/ch17.html#_cabasicanimation_and_its_inheritance – matt

+0

Не знаю если это действительно то, что я хочу. На самом деле цель состоит в том, чтобы добавить это затухание/выход несколько раз в течение определенного периода времени. Тем не менее, я могу просто добавить контрольные точки в качестве анимации на слой, но это, похоже, не так – Swissdude

Смежные вопросы