2010-05-17 1 views
1

Если я реализую метод делегата CALayer actionForLayer:forKey, я могу вернуть [NSNull null], чтобы заставить CALayer не анимировать какие-либо изменения. К сожалению, [NSNull null] не реализует CAAction делегата и XCode выгоняет следующее предупреждение:Возвращение NSNull от actionForLayer: forKey

предупреждение: класс «NSNull» не реализует протокол «» CAAction

Вот код метода:

- (id<CAAction>)actionForLayer:(CALayer *)theLayer 
         forKey:(NSString *)theKey { 
//This disables the animations when moving things around 
//Also, don't animate the selection box. It was doing weird things 
if(undoGroupStarted || theLayer == self.selectionBox) { 
    return [NSNull null]; 
} else { 
    return nil; 
} 
} 

Я что-то не так? Возвращает [NSNull null] плохое поведение? Если да, то каков другой способ сделать то, что я пытаюсь сделать здесь? Если нет, как мне сделать компилятор счастливым?

ответ

2

Раздел «Руководство по программированию CoreAnimation» Defined Search Pattern for Action Keys обращается к этому вопросу. Они CALayer Делегат может вернуть nil, чтобы указать, что он не обрабатывает действие, но что поиск должен продолжаться. Он также может вернуть [NSNull null], чтобы указать, что действие не должно обрабатываться (то есть поиск должен останавливаться).

В заголовке CALayer, вы увидите немного более подробно о том, как это обрабатывается:

Если какой-либо из этих шагов приводит к объекту действия, не ноль, то следующие шаги игнорируются. Если конечным результатом является экземпляр NSNull, он преобразуется в `nil '.

Для того, чтобы компилятор принять это, вы можете просто бросить:

return (id <CAAction>)[NSNull null]; // Prevent the action from animating 
+0

Да, это избавилось от предупреждения компилятора. Что-то заставляет меня замолчать при запуске NSNull ... но это явно не вызовет никаких проблем, так как я возвращаю NSNull все это время без проблем. Благодарю. – MrHen

-1

Судя по документации Apple CAAction, единственным встроенным классом, который реализует протокол CAAction, является CAAnimation (и его подклассы, конечно). Компилятор ожидает возвращаемого значения, которое реализует CAAction, поэтому да, возвращая [NSNull null], не будет работать. Вам действительно нужно использовать этот метод делегата, в отличие от удаления анимаций со слоя с помощью [layer removeAllAnimations] или [layer removeAnimationForKey:]?

кажется расточительным, но если вы абсолютно необходимо использовать метод делегата, возможно, вы могли бы вернуть «пустой» анимации объекта:

return [CAAnimation animation]; 

Кроме того, вам нужно отключить эту анимацию на постоянной основе, или только в конкретных обстоятельствах? Если вам не нужно постоянно переопределять анимацию, вы можете использовать CATransaction для отключения анимации для вызовов отдельных методов, как описано здесь в Core Animation Programming Guide.

+0

нужно только отключить анимацию при определенных обстоятельствах и отключение будет вести себя точно так же до дюжины слоев. Использование делегата позволяет мне переключать свое поведение при появлении обстоятельств. Я попробую пустую анимацию, чтобы увидеть, работает ли она. Я не думаю, что CATransaction будет работать, но я снова посмотрю на это. – MrHen