Как определить CAAnimation в контроллере делегата и выпуска? - PullRequest
4 голосов
/ 15 декабря 2010

I видел видел Как определить CAAnimation в делегате animationDidStop? , это дополнение к нему.

Я не могу заставить это работать должным образом,У меня есть анимация, и я хотел бы выпустить контроллер, в котором он был запущен после окончания анимации.Пример: контроллер переводит справа -> влево, затем освобождает себя.

Определение анимации:

NSValue *end = [NSValue valueWithCGPoint:CGPointMake(800, self.view.center.y)];
NSValue *start = [NSValue valueWithCGPoint:self.view.center];

CABasicAnimation *moveAnimation;        
moveAnimation = [CABasicAnimation animationWithKeyPath:@"position"];
moveAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
moveAnimation.duration = 0.45f;

moveAnimation.fromValue = start;
moveAnimation.toValue = end;

// actually set the position
[self.view.layer setPosition:[end CGPointValue]];

moveAnimation.delegate = self;
moveAnimation.removedOnCompletion = NO;
[self.view.layer addAnimation:moveAnimation forKey:MOVING_OUT];

Внутри метода делегата:

- (void) animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
{
    CAAnimation *check = [self.view.layer animationForKey:MOVING_OUT];

    if (theAnimation == check)
    {
        //[check release];
        [self release];

    }
}

Если я уйдуэтот код как есть, мой контроллер не получает dealloc'd (из-за удержания вызова анимацией).Если я запускаю [check release], я получаю message sent to deallocated instance.

Кто-нибудь знает, что не так?Есть ли другой способ идентифицировать CAAnimation в делегате animationDidStop БЕЗ указания removedOnCompletion = NO?

РЕДАКТИРОВАТЬ: Забыл упомянуть.Не указав, что removedOnCompletion = NO, animationForKey: вернет NULL.Поэтому я не могу определить анимацию.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 21 октября 2012

Я думаю, что возможная причина - CAAnimation.delegate - свойство сохранения (очень странно, упс!).

Определение файла заголовка:

/* The delegate of the animation. This object is retained for the
 * lifetime of the animation object. Defaults to nil. See below for the
 * supported delegate methods. */

@property(retain) id delegate;

Чтобы позволить себе получить релиз, анимация должна быть удалена со слоя, например:

[self.view.layer removeAnimationForKey:@THE_ANIMATION_KEY];
3 голосов
/ 15 декабря 2010

Непонятно, в чем ваша проблема, но это может помочь вам узнать, что CAAnimation экземпляры являются общими контейнерами KVO, поэтому вы можете добавить к ним пользовательскую информацию:

[myAnimation setValue: @"check" forKey: @"name"];

Вы можете проверить это:

if ([[theAnimation valueForKey: @"name"] isEqual: @"check"])
    // ...

Это помогает?

...