Насколько надежен [CALayer animationForKey:]? - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть подкласс CALayer, называемый MyLayer:

@interface MyLayer : CALayer
@property (nonatomic,readonly) BOOL busy;
-(void)performTask1;
-(void)performTask2;
-(void)performTask3;
@end

В performTask* функциях, я говорю:

-(void)performTask*
{
    CAKeyframeAnimation *animation = [...];
    ...
    animation.removedOnCompletion = YES; // "YES" is default anyway
    ...
    [self addAnimation:animation
                forKey:TASK*_KEY];
}

Свойство busy предназначено длявызывающий и реализованный так:

@dynamic busy;
-(BOOL)busy
{
        // i.e. for some specific ids
    return ([self animationForKey:TASK1_KEY] != nil ||
            [self animationForKey:TASK3_KEY] != nil);
}

Я вижу, что этот подход ненадежен ... Я вижу на экране, что анимация завершена (ничего не движется и т. д.)..), в то время как animationForKey: НЕ возвращает nil.Поведение является полу-случайным ... В большинстве случаев это происходит так, как ожидалось.Но иногда это занимает 1-2 секунды, прежде чем я начинаю получать nil -s.

Это странное поведение исчезает , если я устанавливаю делегата для анимации animation.delegate = self и реализую animationDidStop:finished:.

Кто-то тоже испытал это?

1 Ответ

0 голосов
/ 20 марта 2012

Объявление @dynamic заставляет CALayer реализовать метод доступа для вас (см. Свойства подкласса CALayer не отслеживаются CATransaction и CALayer и CAAnimation для динамического разрешения не реализованных средств доступа к свойствам ). Так что, возможно, вы просто видите путаницу, когда вызывается версия «занят». Почему вы объявили "@dynamic" в первую очередь?

Возможно, с animationForKey может произойти что-то необычное, но сначала я попытаюсь удалить "@dynamic".

...