Поддерживает ли iPhone OS неявную анимацию?
Пример из Mac OS X:
[[aView animator] setFrame:NSMakeRect(100.0,100.0,300.0,300.0)];
Я пробовал нечто подобное в UIKit, но, похоже, метод аниматора не существует для UIView. Так что нет "неявной" анимации?
2 ответа
IPhone поддерживает неявную анимацию, хотя он не использует объект-аниматор, он встроен непосредственно в UIView. Попробуйте это вместо этого:
[UIView beginAnimations:nil context:nil];
[aView setFrame:NSMakeRect(100.0,100.0,300.0,300.0)];
[UIView commitAnimations];
Точные детали документированы здесь.
Каждое представление также всегда поддерживается слоями, поэтому вам не нужно включать слои, чтобы получить слой для явной анимации.
Оказывается, iPhone OS действительно поддерживает неявные анимации на CALayer, как это определено в Руководстве по программированию базовой анимации от Apple. В Mac OS X слой становится анимируемым, когда он поддерживает NSView, установив:
[view setWantsLayer:YES];
В iPhone OS просто установите делегат слоя для класса, производного от UIViewController, в котором находится объект, производный от UIView, который вы хотите анимировать. Например, если у вас есть свойство, определенное для UILabel с именем label, внутри класса, производного от UIViewController, в котором он размещен, код будет выглядеть примерно так (пример обработчика события для события UIButton Touch Up Inside):
-(void) buttonPressedToAnimateTheLabel:(id)sender
{
CALayer *labelLayer = self.label.layer;
labelLayer.delegate = self;
layer.position = CGPointMake(labelLayer.position.x, labelLayer.position.y + 50);
}
Затем метка будет анимирована точно так же, как в Mac OS X, просто изменив положение.
Некоторые заметки об этом:
это определенно UIViewController, который является делегатом, а не UIView. Создание UIView делегата вызывает взрыв приложения.
делегат должен быть установлен в методе, вызываемом после того, как производный от UIViewController класс полностью завершил загрузку, то есть в обработчике события для элемента управления, размещенного в классе. Я попытался добавить его в initWithNibName: bundle:, awakeFromNib, viewDidLoad и viewWillAppear: animated, и это не сработало. Установка делегата в первых двух методах заставляла метку не анимироваться; он просто сразу поменял позиции. Добавление его в последние два привело к тому, что ярлык полностью исчез.
после того, как делегат установлен один раз в обработчике событий, он будет полезен до конца срока службы класса, производного от UIViewController. Изменение свойств слоя в других обработчиках событий приведет к их анимации без повторной установки делегата для слоя.
когда класс, производный от UIViewController, теряет фокус, делегат должен быть установлен равным nil в методе viewWillDisappear:animated, иначе приложение взорвется
Должно быть какое-то место, чтобы установить делегат только один раз, чтобы он не устанавливался несколько раз в результате вызова обработчика событий, но я еще не нашел это место. По крайней мере, он работает таким образом, и установка его несколько раз в результате многократного вызова обработчика событий кажется достаточно безвредной.
Было бы неплохо, если бы все это было задокументировано в Руководстве по программированию основной анимации. Я провел дни, пытаясь понять это! Надеюсь, это избавит вас от всех проблем, связанных с охотой!