Анимации
Анимации обеспечивают жидкие визуальные переходы между различными состояниями Вашего пользовательского интерфейса. В iOS анимации используются экстенсивно, чтобы изменить местоположение представлений, изменить их размер, удалить их из иерархий представления и скрыть их. Вы могли бы использовать анимации, чтобы передать обратную связь пользователю или реализовать интересные визуальные эффекты.
В iOS создание сложных анимаций не требует, чтобы Вы записали любой код для прорисовки. Все методы анимации, описанные в этой главе, используют встроенную поддержку, предоставленную Базовой Анимацией. Все, что необходимо сделать, инициировать анимацию и позволить Базовой Анимации обработать рендеринг отдельных кадров. Это делает создающие сложные анимации очень простыми только с несколькими строками кода.
Что может быть анимировано?
И UIKit и Базовая Анимация предоставляют поддержку для анимаций, но варьируется уровень поддержки, предоставленной каждой технологией. В UIKit анимации выполняются с помощью UIView
объекты. Представления поддерживают основной набор анимаций, покрывающих много общих задач. Например, можно анимировать изменения в свойствах представлений или использовать анимации перехода для замены одного набора представлений с другим.
Таблица 4-1 перечисляет animatable свойства — свойства, имеющие встроенную поддержку анимации — UIView
класс. Быть animatable не означает, что анимации происходят автоматически. Изменение значения этих свойств обычно просто обновляет свойство (и представление) сразу без анимации. Для анимации такого изменения необходимо изменить значение свойства из блока анимации, описанного в Анимации Изменений Свойства в Представлении.
Свойство | Изменения можно сделать |
---|---|
Измените это свойство для изменения размера представления и позиции относительно системы координат ее суперпредставления. (Если | |
Измените это свойство для изменения размера представления. | |
Измените это свойство, чтобы сменить положение представления относительно системы координат его суперпредставления. | |
Измените это свойство, чтобы масштабировать, повернуть, или перевести представление относительно его центральной точки. Трансформации с помощью этого свойства всегда выполняются в 2D пространстве. (Для выполнения 3D трансформаций необходимо анимировать расположенный на слое объект представления с помощью Базовой Анимации.) | |
Измените это свойство для постепенного изменения прозрачности представления. | |
Измените это свойство для изменения цвета фона представления. | |
Измените это свойство для изменения способа, которым содержание представления расширяется для заполнения свободного места. |
Анимированные переходы представления являются способом для Вас внести изменения в Вашу иерархию представления вне предлагаемых контроллерами представления. Несмотря на то, что необходимо использовать контроллеры представления для управления сжатыми иерархиями представления, могут быть времена, когда Вы хотите заменить все или часть иерархии представления. В тех ситуациях можно использовать основанные на представлении переходы для анимации дополнения и удаления представлений.
В местах, где Вы хотите выполнить более сложные анимации или анимации, не поддерживаемые UIView
класс, можно использовать Базовую Анимацию и нижележащий слой представления для создания анимации. Поскольку представление и расположенные на слое объекты запутанно соединены, изменения в уровне представления влияют на само представление. Используя Базовую Анимацию, можно анимировать следующие типы изменений для уровня представления:
Размер и позиция уровня
Центральная точка, используемая при выполнении трансформаций
Трансформации к уровню или его подуровням в 3D пространстве
Дополнение или удаление уровня от иерархии слоев
Z-порядок уровня относительно других одноуровневых уровней
Тень уровня
Граница уровня (включая то, округлены ли углы уровня),
Часть уровня, простирающегося во время изменения размеров операций
Непрозрачность уровня
Поведение отсечения для подуровней, лежащих вне границ уровня
Текущее содержание уровня
Поведение растеризации уровня
Несмотря на то, что эта глава адресует несколько Базовых способов поведения Анимации, она делает так в связи с инициированием их от Вашего кода представления. Для большей полной информации о том, как использовать Базовую Анимацию для анимации уровней, см. Базовое Руководство по программированию Анимации и Базовую Поваренную книгу Анимации.
Анимация изменений свойства в представлении
Для анимации изменений в свойстве UIView
класс, необходимо обернуть те изменения в блоке анимации. Блок анимации срока используется в универсальном смысле относиться к любому коду, определяющему animatable изменения. В iOS 4 и позже, Вы создаете блочный блок использования анимации объекты. В более ранних версиях iOS Вы отмечаете начало и конец блока анимации с помощью специальных методов класса UIView
класс. Оба метода поддерживают те же параметры конфигурации и предлагают ту же сумму управления выполнением анимации. Однако основанные на блоке методы предпочтены, когда это возможно.
Следующие разделы фокусируются на коде, в котором Вы нуждаетесь для анимации изменений для просмотра свойств. Для получения информации о том, как создать анимированные переходы между наборами представлений, посмотрите Анимированные переходы Создания Между Представлениями.
Запуск анимаций Используя основанные на блоке методы
В iOS 4 и позже, Вы используете основанные на блоке методы класса инициировать анимации. Существует несколько основанных на блоке методов, предлагающих разные уровни конфигурации для блока анимации. Эти методы:
Поскольку это методы класса, блоки анимации, которые Вы создаете с ними, не связываются к единственному представлению. Таким образом можно использовать эти методы для создания единственной анимации, включающей изменения в многократных представлениях. Например, Перечисление 4-1 показывает, что код должен был постепенно появиться одно представление при постепенном исчезновении другого за один период второго раза. Когда этот код выполняется, указанные анимации сразу запускаются на другом потоке, чтобы избежать блокировать текущий поток или основной поток Вашего приложения.
Перечисление 4-1 , Выполняющее простую основанную на блоке анимацию
[UIView animateWithDuration:1.0 animations:^{ |
firstView.alpha = 0.0; |
secondView.alpha = 1.0; |
}]; |
Анимации в предыдущем примере работают только один раз использование простоты - в, упрощают кривую анимации. Если Вы хотите изменить параметры анимации по умолчанию, необходимо использовать animateWithDuration:delay:options:animations:completion:
метод для выполнения анимаций. Этот метод позволяет Вам настроить следующие параметры анимации:
Задержка для использования прежде, чем запустить анимацию
Тип синхронизации кривой для использования во время анимации
Число раз анимация должно повториться
Должна ли анимация инвертировать себя автоматически, когда она достигает конца
В то время как анимации происходят, поставлены ли сенсорные события представлениям
Должна ли анимация прервать какие-либо происходящие анимации или ожидать, пока те не завершены перед запуском
Другая вещь это оба animateWithDuration:animations:completion:
и animateWithDuration:delay:options:animations:completion:
поддержка методов является возможностью указать блок обработчика завершения. Вы могли бы использовать обработчик завершения для сигнализации приложения, которое закончила определенная анимация. Обработчики завершения являются также способом соединить отдельные анимации.
Перечисление 4-2 показывает пример блока анимации, использующего обработчик завершения для инициирования новой анимации после того, как заканчивается первый. Первый вызов к animateWithDuration:delay:options:animations:completion:
устанавливает анимацию постепенного исчезновения и конфигурирует его с некоторыми пользовательскими опциями. Когда та анимация завершена, ее обработчик завершения работает и устанавливает вторую половину анимации, постепенно появляющейся представление назад после задержки.
Используя завершение обработчик является основным способом, которым Вы соединяете многократные анимации.
Перечисление 4-2 , Создающее анимацию, блокирует с пользовательскими опциями
- (IBAction)showHideView:(id)sender |
{ |
// Fade out the view right away |
[UIView animateWithDuration:1.0 |
delay: 0.0 |
options: UIViewAnimationOptionCurveEaseIn |
animations:^{ |
thirdView.alpha = 0.0; |
} |
completion:^(BOOL finished){ |
// Wait one second and then fade in the view |
[UIView animateWithDuration:1.0 |
delay: 1.0 |
options:UIViewAnimationOptionCurveEaseOut |
animations:^{ |
thirdView.alpha = 1.0; |
} |
completion:nil]; |
}]; |
} |
Запуск Анимаций Используя Начинать/Фиксировать Методы
Если Ваше выполнение приложения в iOS 3.2 и ранее, необходимо использовать beginAnimations:context:
и commitAnimations
методы класса из UIView
определить Ваши блоки анимации. Эти методы отмечают начало и конец Вашего блока анимации. Любые animatable свойства, которые Вы изменяете между этими методами, анимированы к их новым значениям после вызова commitAnimations
метод. Выполнение анимаций происходит на вторичном потоке, чтобы избежать блокировать текущий поток или основной поток Вашего приложения.
Перечисление 4-3 показывает, что код должен был реализовать то же поведение как Перечисление 4-1, но использование начинать/фиксировать методов. Как в Перечислении 4-1, этот код постепенно исчезает одно представление при постепенном появлении еще более чем одной секунды времени. Однако в этом примере, необходимо установить продолжительность анимации с помощью вызова отдельного метода.
Перечисление 4-3 , Выполняющее простое, начинает/фиксирует анимацию
[UIView beginAnimations:@"ToggleViews" context:nil]; |
[UIView setAnimationDuration:1.0]; |
// Make the animatable changes. |
firstView.alpha = 0.0; |
secondView.alpha = 1.0; |
// Commit the changes and perform the animation. |
[UIView commitAnimations]; |
По умолчанию все animatable изменения свойства в блоке анимации анимированы. Если Вы хотите анимировать некоторые изменения, но не других, используйте setAnimationsEnabled:
метод для отключения анимаций временно внесите любые изменения, которые Вы не хотите анимированный, и затем вызываете setAnimationsEnabled:
снова повторно включить анимации. Можно определить, ли анимации текущие включенный путем вызова areAnimationsEnabled
метод класса.
Конфигурирование Параметров для Начинает/Фиксирует Анимации
Для конфигурирования параметров анимации для начинать/фиксировать блока анимации Вы используете любые из нескольких UIView
методы класса. Таблица 4-2 перечисляет эти методы и описывает, как Вы используете их для конфигурирования анимаций. Большинство этих методов нужно вызвать только из начинать/фиксировать блока анимации, но некоторые могут также использоваться с основанными на блоке анимациями. Если Вы не вызываете один из этих методов от Вашего блока анимации, значение по умолчанию для соответствующего атрибута используется. Для получения дополнительной информации о значении по умолчанию, связанном с каждым методом, см. описание метода в Ссылке класса UIView.
Метод | Использование |
---|---|
Используйте любой из этих методов для указания, когда выполнение должно будет начать выполняться. Если указанная дата начала находится в прошлом (или задержка 0), анимации начинаются как можно скорее. | |
Используйте этот метод для установки промежутка времени, за который можно выполнить анимации. | |
Используйте этот метод для установки кривой синхронизации анимаций. Это управляет, выполняются ли анимации линейно или скорость изменения в определенные времена. | |
Используйте эти методы для установки числа раз повторения анимации и работает ли анимация наоборот в конце каждого полного цикла. Для получения дополнительной информации об использовании этих методов посмотрите Анимации Реализации, Инвертирующие Себя. | |
Используйте эти методы для выполнения кода сразу прежде или после анимаций. Для получения дополнительной информации об использовании делегата посмотрите Конфигурирование Делегата Анимации. | |
Используйте этот метод, чтобы сразу остановить все предыдущие анимации и запустить новые анимации с останавливающейся точки. Если Вы передаете |
Перечисление 4-4 показывает, что код должен был реализовать то же поведение как код в Перечислении 4-2, но использовании начинать/фиксировать методов. Как прежде, этот код постепенно исчезает представление, ожидает одна секунда, и затем исчезает, это въезжает задним ходом. Для реализации второй части анимации, кодовые наборы делегат анимации и реализации метод обработчиков-остановки. Тот метод обработчиков тогда устанавливает вторую половину анимаций и выполняет их.
Перечисление 4-4 , Конфигурирующее параметры анимации с помощью начинать/фиксировать методов
// This method begins the first animation. |
- (IBAction)showHideView:(id)sender |
{ |
[UIView beginAnimations:@"ShowHideView" context:nil]; |
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; |
[UIView setAnimationDuration:1.0]; |
[UIView setAnimationDelegate:self]; |
[UIView setAnimationDidStopSelector:@selector(showHideDidStop:finished:context:)]; |
// Make the animatable changes. |
thirdView.alpha = 0.0; |
// Commit the changes and perform the animation. |
[UIView commitAnimations]; |
} |
// Called at the end of the preceding animation. |
- (void)showHideDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context |
{ |
[UIView beginAnimations:@"ShowHideView2" context:nil]; |
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; |
[UIView setAnimationDuration:1.0]; |
[UIView setAnimationDelay:1.0]; |
thirdView.alpha = 1.0; |
[UIView commitAnimations]; |
} |
Конфигурирование делегата анимации
Если Вы хотите выполнить код сразу прежде или после анимации, необходимо связать объект делегата и запуск или остановить селектор с Вашим начинать/фиксировать блок анимации. Вы устанавливаете свой объект делегата использование setAnimationDelegate:
метод класса из UIView
и Вы устанавливаете свой запуск и селекторы остановки с помощью setAnimationWillStartSelector:
и setAnimationDidStopSelector:
методы класса. Во время анимации, системные вызовы анимации Ваши методы делегата в подходящее время, чтобы дать Вам шанс выполнить Ваш код.
Подписи Ваших методов делегата анимации должны быть подобны следующему:
- (void)animationWillStart:(NSString *)animationID context:(void *)context; |
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context; |
animationID и параметры контекста для обоих методов являются теми же параметрами, которые Вы передали beginAnimations:context:
метод в начале блока анимации:
animationID — Предоставленная строка приложения раньше идентифицировала анимацию.
контекст — предоставляемый объект приложения, который можно использовать, чтобы передать дополнительную информацию делегату.
setAnimationDidStopSelector:
селекторный метод имеет дополнительный параметр — булево значение, которое является YES
если анимация работала к завершению. Если значение этого параметра NO
, анимация была или отменена или остановлена преждевременно другой анимацией.
Вложенные блоки анимации
Можно присвоить различную синхронизацию и параметры конфигурации к частям блока анимации вложенными дополнительными блоками анимации. Поскольку имя подразумевает, вложенный блок анимации является новым блоком анимации, создаваемым в существующем блоке анимации. Вложенные анимации запускаются в то же время, что и любые родительские анимации, но работают (по большей части) с их собственными параметрами конфигурации. По умолчанию вложенные анимации действительно наследовали продолжительность родителя и кривую анимации, но даже те опции могут быть переопределены по мере необходимости.
Перечисление 4-5 показывает пример того, как вложенная анимация используется для изменения синхронизации, продолжительности и поведения некоторых анимаций в полной группе. В этом случае два представления исчезаются к общей прозрачности, но прозрачности anotherView
объект изменяется назад и вперед несколько раз, прежде чем он будет наконец скрыт. UIViewAnimationOptionOverrideInheritedCurve
и UIViewAnimationOptionOverrideInheritedDuration
ключи, используемые во вложенном блоке анимации, позволяют кривой и значениям продолжительности от первой анимации быть измененной для второй анимации. Если бы эти ключи не присутствовали, то продолжительность и кривая внешнего блока анимации использовались бы вместо этого.
Анимации Вложения перечисления 4-5, имеющие различные конфигурации
[UIView animateWithDuration:1.0 |
delay: 1.0 |
options:UIViewAnimationOptionCurveEaseOut |
animations:^{ |
aView.alpha = 0.0; |
// Create a nested animation that has a different |
// duration, timing curve, and configuration. |
[UIView animateWithDuration:0.2 |
delay:0.0 |
options: UIViewAnimationOptionOverrideInheritedCurve | |
UIViewAnimationOptionCurveLinear | |
UIViewAnimationOptionOverrideInheritedDuration | |
UIViewAnimationOptionRepeat | |
UIViewAnimationOptionAutoreverse |
animations:^{ |
[UIView setAnimationRepeatCount:2.5]; |
anotherView.alpha = 0.0; |
} |
completion:nil]; |
} |
completion:nil]; |
При использовании начинать/фиксировать методов для создания анимаций, вложение работает почти таким же способом с основанными на блоке методами. Каждый последовательный вызов к beginAnimations:context:
в уже открытой анимации блок создает новый вложенный блок анимации, который можно сконфигурировать по мере необходимости. Любые изменения конфигурации, которые Вы делаете, применяются к последний раз открытому блоку анимации. Все блоки анимации должны быть закрыты с вызовом для commitAnimations
прежде чем анимации представлены и выполнены.
Реализация анимаций, инвертирующих себя
При создании обратимых анимаций в сочетании с повторным счетом рассмотрите указание не целочисленного значения для повторного счета. Для автообратной анимации каждый полный цикл анимации включает анимацию от исходного значения до нового значения и назад снова. Если Вы хотите, чтобы Ваша анимация закончилась на новом значении, добавив 0.5
к причинам повторного счета анимация для завершения дополнительной половины цикла должна была закончиться в новом значении. Если Вы не будете включать эту половину шага, то Ваша анимация будет анимировать к исходному значению и затем хватать быстро к новому значению, которое может не быть визуальным эффектом, который Вы хотите.
Создание анимированных переходов между представлениями
Переходы представления помогают Вам скрыть внезапные изменения, связанные с добавлением, удалением, сокрытием или показом представлений в Вашей иерархии представления. Вы используете переходы представления для реализации следующих типов изменений:
Измените видимые подпредставления существующего представления. Когда Вы хотите внести относительно небольшие изменения в существующее представление, Вы обычно выбираете эту опцию.
Замените одно представление в своей иерархии представления с другим представлением. Вы обычно выбираете эту опцию, когда Вы хотите заменить иерархию представления, охватывающую все или большую часть экрана.
Изменение подпредставлений представления
Изменение подпредставлений представления позволяет Вам вносить умеренные изменения в представление. Например, Вы могли бы добавить или удалить подпредставления для переключения суперпредставления между двумя различными состояниями. К этому времени конец анимаций выведено на экран то же представление, но его содержание теперь отличается.
В iOS 4 и позже, Вы используете transitionWithView:duration:options:animations:completion:
метод для инициирования анимации перехода для представления. В блоке анимаций, переданном этому методу, обычно анимирующиеся единственные изменения являются связанными с показом, сокрытием, добавлением или удалением подпредставлений. Ограничение анимаций к этому набору позволяет представлению создавать изображение снимка прежде и после версий представления и анимационный между двумя изображениями, который более эффективен. Однако, если необходимо анимировать другие изменения, можно включать UIViewAnimationOptionAllowAnimatedContent
опция при вызове метода. Включая ту опцию препятствует тому, чтобы представление создало снимки, и анимирует все изменения непосредственно.
Перечисление 4-6 является примером того, как использовать анимацию перехода, чтобы заставить его казаться, как будто была добавлена новая страница ввода текста. В этом примере основное представление содержит два встроенных текстовых представления. Текстовые представления сконфигурированы тождественно, но каждый всегда видим, в то время как другой всегда скрыт. Когда пользователь касается кнопки для создания новой страницы, этот метод переключает видимость двух представлений, приводящий к новой пустой странице с пустым текстом просматривают готовый принять текст. После того, как переход завершен, представление сохранило текст от старой страницы с помощью закрытого метода и сбрасывает теперь представление скрытого текста так, чтобы это могло быть снова использовано позже. Представление тогда располагает свои указатели так, чтобы это могло быть готово сделать ту же вещь, если пользователь запрашивает еще одну новую страницу.
Перечисление 4-6 , Подкачивающее пустой текст, просматривает для существующего
- (IBAction)displayNewPage:(id)sender |
{ |
[UIView transitionWithView:self.view |
duration:1.0 |
options:UIViewAnimationOptionTransitionCurlUp |
animations:^{ |
currentTextView.hidden = YES; |
swapTextView.hidden = NO; |
} |
completion:^(BOOL finished){ |
// Save the old text and then swap the views. |
[self saveNotes:temp]; |
UIView* temp = currentTextView; |
currentTextView = swapTextView; |
swapTextView = temp; |
}]; |
} |
Если необходимо выполнить переходы представления в iOS 3.2 и ранее, можно использовать setAnimationTransition:forView:cache:
метод для указания параметров для перехода. Представление, которое Вы передаете тому методу, является тем же самым, Вы передали бы в как первый параметр к transitionWithView:duration:options:animations:completion:
метод. Перечисление 4-7 показывает, что базовая структура анимации блокирует Вас, должен создать. Обратите внимание на то, что для реализации блока завершения, показанного в Перечислении 4-6, необходимо было бы сконфигурировать делегата анимации с обработчиком-остановки, как описано в Конфигурировании Делегата Анимации.
Подпредставления Изменения перечисления 4-7 с помощью начинать/фиксировать методов
[UIView beginAnimations:@"ToggleSiblings" context:nil]; |
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; |
[UIView setAnimationDuration:1.0]; |
// Make your changes |
[UIView commitAnimations]; |
Замена представления с другим представлением
Замена представлений является чем-то, что Вы делаете, когда Вы хотите, чтобы Ваш интерфейс существенно отличался. Поскольку этот метод подкачивает только представления (и не контроллеры представления), Вы ответственны за разработку объектов контроллера Вашего приложения соответственно. Этот метод является просто способом представить новые представления быстро с помощью некоторых стандартных переходов.
В iOS 4 и позже, Вы используете transitionFromView:toView:duration:options:completion:
метод для перехода между двумя представлениями. Этот метод фактически удаляет первое представление из Вашей иерархии и вставляет другой, таким образом, необходимо удостовериться, что у Вас есть ссылка на первое представление, если Вы хотите сохранить его. Если Вы хотите скрыться, представления вместо удаляют их из Вашей иерархии представления, передают UIViewAnimationOptionShowHideTransitionViews
ключ как одна из опций.
Перечисление 4-8 показывает, что код должен был подкачать между двумя основными представлениями, которыми управляет единственный контроллер представления. В этом примере корневое представление контроллера представления всегда выводит на экран одно из двух дочерних представлений (primaryView
или secondaryView
). Каждое представление представляет то же содержание, но делает так по-другому. Контроллер представления использует displayingPrimary
задействованная переменная (булево значение) для отслеживания, которых представление выведено на экран в любой момент времени. Зеркально отраженное направление изменяется, в зависимости от которого выводится на экран представление.
Перечисление 4-8 , Переключающееся между двумя представлениями в контроллере представления
- (IBAction)toggleMainViews:(id)sender { |
[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView) |
toView:(displayingPrimary ? secondaryView : primaryView) |
duration:1.0 |
options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight : |
UIViewAnimationOptionTransitionFlipFromLeft) |
completion:^(BOOL finished) { |
if (finished) { |
displayingPrimary = !displayingPrimary; |
} |
}]; |
} |
Соединение многократных анимаций
UIView
интерфейсы анимации предоставляют поддержку для соединения отдельных блоков анимации так, чтобы они выполнили последовательно вместо одновременно. Процесс для соединения блоков анимации зависит от того, используете ли Вы основанные на блоке методы анимации или начинать/фиксировать методы:
Для основанных на блоке анимаций используйте обработчик завершения, поддерживаемый
animateWithDuration:animations:completion:
иanimateWithDuration:delay:options:animations:completion:
методы для выполнения любых последующих анимаций.Для начинают/фиксируют анимации, связывают объект делегата и селектор-остановки с анимацией. Для получения информации о том, как связать делегата с Вашими анимациями, посмотрите Конфигурирование Делегата Анимации.
Альтернатива соединению анимаций должна использовать вложенные анимации с различными величинами задержки, чтобы запустить анимации в разное время. Для получения дополнительной информации о том, как вложить анимации, посмотрите Вложенные Блоки Анимации.
Анимация представления и изменений слоя вместе
Приложения могут свободно смешать основанный на представлении и основанный на уровне код анимации по мере необходимости, но процесс для конфигурирования Ваших параметров анимации зависит от того, кому принадлежит уровень. Изменение уровня находившегося в собственности представления совпадает с изменением самого представления, и любые анимации, Вы применяетесь к свойствам уровня, уважают параметры анимации основанного на текущем представлении блока анимации. То же не является истиной для уровней, которые Вы создаете сами. Пользовательские расположенные на слое объекты игнорируют основанные на представлении блочные параметры анимации и используют Базовые параметры Анимации по умолчанию вместо этого.
Если Вы хотите настроить параметры анимации для уровней, Вы создаете, необходимо использовать Базовую Анимацию непосредственно. Как правило, анимация уровней с помощью Базовой Анимации включает создание a CABasicAnimation
возразите или некоторый другой конкретный подкласс CAAnimation
. Вы тогда добавляете что анимация к соответствующему уровню. Можно применить анимацию от любой внутренней или внешней части основанный на представлении блок анимации.
Перечисление 4-9 показывает анимацию, изменяющую представление и пользовательский уровень одновременно. Представление в этом примере содержит пользовательское CALayer
объект в центре его границ. Анимация поворачивает представление против часовой стрелки при вращении уровня по часовой стрелке. Поскольку вращения находятся в противоположных направлениях, уровень поддерживает его исходную ориентацию относительно экрана и, кажется, не вращается значительно. Однако представление ниже того уровня вращает 360 градусов и возвращается к его исходной ориентации. Этот пример представлен прежде всего, чтобы продемонстрировать, как можно смешать анимации уровня и представление. Этот тип смешивания не должен использоваться в ситуациях, где необходима точная синхронизация.
Представление Listing 4-9 Mixing и анимации уровня
[UIView animateWithDuration:1.0 |
delay:0.0 |
options: UIViewAnimationOptionCurveLinear |
animations:^{ |
// Animate the first half of the view rotation. |
CGAffineTransform xform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-180)); |
backingView.transform = xform; |
// Rotate the embedded CALayer in the opposite direction. |
CABasicAnimation* layerAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; |
layerAnimation.duration = 2.0; |
layerAnimation.beginTime = 0; //CACurrentMediaTime() + 1; |
layerAnimation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ]; |
layerAnimation.timingFunction = [CAMediaTimingFunction |
functionWithName:kCAMediaTimingFunctionLinear]; |
layerAnimation.fromValue = [NSNumber numberWithFloat:0.0]; |
layerAnimation.toValue = [NSNumber numberWithFloat:DEGREES_TO_RADIANS(360.0)]; |
layerAnimation.byValue = [NSNumber numberWithFloat:DEGREES_TO_RADIANS(180.0)]; |
[manLayer addAnimation:layerAnimation forKey:@"layerAnimation"]; |
} |
completion:^(BOOL finished){ |
// Now do the second half of the view rotation. |
[UIView animateWithDuration:1.0 |
delay: 0.0 |
options: UIViewAnimationOptionCurveLinear |
animations:^{ |
CGAffineTransform xform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-359)); |
backingView.transform = xform; |
} |
completion:^(BOOL finished){ |
backingView.transform = CGAffineTransformIdentity; |
}]; |
}]; |
Если точная синхронизация между Вашим представлением и уровнем базировалась, анимации требуется, рекомендуется создать все анимации с помощью Базовой Анимации. Можно найти, что некоторые анимации проще выполнить использующую Базовую Анимацию так или иначе. Например, основанное на представлении вращение в Перечислении 4-9 требует многоступенчатой последовательности для вращений больше чем 180 градусов, тогда как Базовая часть Анимации использует функцию значения вращения, вращающуюся от начала до конца через среднее значение.
Для получения дополнительной информации о том, как создать и сконфигурировать анимации с помощью Базовой Анимации, см. Базовое Руководство по программированию Анимации и Базовую Поваренную книгу Анимации.