Усовершенствованные приемы анимации
Существует много способов сконфигурировать Ваши основанные на свойстве или анимации ключевых кадров, чтобы сделать больше для Вас. Приложения, которые должны выполнить многократные анимации вместе или последовательно могут использовать более усовершенствованные способы поведения синхронизировать синхронизацию тех анимаций или объединить их в цепочку вместе. Можно также использовать другие типы объектов Animation для создания визуальных переходов и других интересных анимируемых эффектов.
Изменения поддержки анимаций перехода в видимости слоя
Поскольку имя подразумевает, объект Animation перехода создает анимированный визуальный переход для уровня. Наиболее популярный способ использования объектов перехода должен анимировать появление одного уровня и исчезновение другого скоординированным способом. В отличие от основанной на свойстве анимации, где анимация изменяет одно свойство уровня, анимация перехода управляет кэшируемым изображением уровня для создания визуальных эффектов, которые были бы трудными или невозможными сделать путем изменения одних только свойств. Стандартные типы переходов позволяют, Вы выполнить показываете, продвигаете, перемещаете или плавно накладываете анимации. На OS X можно также использовать Базовые фильтры Изображения для создания переходов, использующих другие типы эффектов те, которые вытирают, завихрения страницы, пульсации или пользовательские эффекты, которые Вы разрабатываете.
Для выполнения анимации перехода Вы создаете a CATransition
возразите и добавьте его к уровням, вовлеченным в переход. Вы используете объект перехода для указания типа перехода для выполнения и запуск и конечные точки анимации перехода. Вы не должны использовать всю анимацию перехода также. Объект перехода позволяет Вам указать запуск и значения прогресса конца для использования при анимации. Эти значения позволяют Вам сделать, вещам нравится, запускают или заканчивают анимацию в ее средней точке.
Перечисление 5-1 показывает, что код раньше создавал анимированный переход нажатия между двумя представлениями. В примере, обоих myView1
и myView2
расположены в той же позиции в том же родительском представлении, но только myView1
в настоящее время видимо. Причины перехода нажатия myView1
выскользнуть налево и исчезнуть, пока это не скрыто в то время как myView2
задвигает от права и становится видимым. Обновление скрытого свойства обоих представлений гарантирует, что видимость обоих представлений корректна в конце анимации.
Перечисление 5-1 , Анимирующее переход между двумя представлениями в iOS
CATransition* transition = [CATransition animation]; |
transition.startProgress = 0; |
transition.endProgress = 1.0; |
transition.type = kCATransitionPush; |
transition.subtype = kCATransitionFromRight; |
transition.duration = 1.0; |
// Add the transition animation to both layers |
[myView1.layer addAnimation:transition forKey:@"transition"]; |
[myView2.layer addAnimation:transition forKey:@"transition"]; |
// Finally, change the visibility of the layers. |
myView1.hidden = YES; |
myView2.hidden = NO; |
Когда два уровня вовлечены в тот же переход, можно использовать тот же объект перехода для обоих. Используя тот же объект перехода также упрощает код, который необходимо записать. Если параметры перехода для каждого уровня отличаются, Однако Вы можете использовать различные объекты перехода и должны были бы определенно сделать так.
Перечисление 5-2 показывает, как использовать Базовый фильтр Изображения для реализации эффекта перехода на OS X. После конфигурирования фильтра с параметрами Вы хотите, присваиваете его filter
свойство объекта перехода. После этого процесс для применения анимации совпадает с для других типов объектов Animation.
Перечисление 5-2 Используя Базовое Изображение фильтрует для анимации перехода на OS X
// Create the Core Image filter, setting several key parameters. |
CIFilter* aFilter = [CIFilter filterWithName:@"CIBarsSwipeTransition"]; |
[aFilter setValue:[NSNumber numberWithFloat:3.14] forKey:@"inputAngle"]; |
[aFilter setValue:[NSNumber numberWithFloat:30.0] forKey:@"inputWidth"]; |
[aFilter setValue:[NSNumber numberWithFloat:10.0] forKey:@"inputBarOffset"]; |
// Create the transition object |
CATransition* transition = [CATransition animation]; |
transition.startProgress = 0; |
transition.endProgress = 1.0; |
transition.filter = aFilter; |
transition.duration = 1.0; |
[self.imageView2 setHidden:NO]; |
[self.imageView.layer addAnimation:transition forKey:@"transition"]; |
[self.imageView2.layer addAnimation:transition forKey:@"transition"]; |
[self.imageView setHidden:YES]; |
Настройка синхронизации анимации
Синхронизация является важной частью анимаций, и с Базовой Анимацией Вы указываете точную информацию синхронизации для своих анимаций через методы и свойства CAMediaTiming
протокол. Два Базовых класса Анимации принимают этот протокол. CAAnimation
класс принимает его так, чтобы можно было указать информацию синхронизации в объектах Animation. CALayer
также принимает его так, чтобы можно было сконфигурировать некоторые связанные с синхронизацией функции неявных анимаций, несмотря на то, что неявная транзакция возражает, что переносится, те анимации обычно обеспечивает имеющую приоритет информацию синхронизации по умолчанию.
При размышлении о синхронизации и анимациях, важно понять, как расположенные на слое объекты работают со временем. Каждый уровень имеет свое собственное местное время, которое он использует для управления синхронизацией анимации. Обычно, местное время двух различных уровней достаточно близко, что Вы могли указать те же временные стоимости для каждого, и пользователь ничего не мог бы заметить. Однако местное время уровня может быть изменено его родительскими слоями или его собственными параметрами синхронизации. Например, изменение уровня speed
свойство заставляет продолжительность анимаций на том уровне (и его подуровни) изменяться пропорционально.
Для помощи Вы во временных стоимостях проверки являетесь подходящими для данного уровня, CALayer
класс определяет convertTime:fromLayer:
и convertTime:toLayer:
методы. Можно использовать эти методы, чтобы преобразовать фиксированную временную стоимость в местное время уровня или преобразовать временные стоимости от одного уровня до другого. Методы принимают во внимание свойства синхронизации носителей, которые могли бы влиять на местное время уровня и возвратить значение, которое можно использовать с другим уровнем. Перечисление 5-3 показывает пример, что необходимо использовать регулярно для получения текущего местного времени для уровня. CACurrentMediaTime
функция является функцией удобства, возвращающей текущее время часов компьютера, которое метод занимает и преобразовывает в местное время уровня.
Перечисление 5-3 , Получающее текущее местное время уровня
CFTimeInterval localLayerTime = [myLayer convertTime:CACurrentMediaTime() fromLayer:nil]; |
Как только у Вас есть временная стоимость в местное время уровня, можно использовать то значение для обновления связанных с синхронизацией свойств объекта Animation или уровня. С этими свойствами синхронизации можно достигнуть некоторых интересных способов поведения анимации, включая:
Используйте
beginTime
свойство для установки времени начала анимации. Обычно, анимации начинаются во время следующего цикла обновления. Можно использоватьbeginTime
параметр для задержки начального времени анимации на несколько секунд. Способ объединить две анимации в цепочку вместе состоит в том, чтобы установить начать время одной анимации для соответствия времени окончания другой анимации.При задержке запуска анимации Вы могли бы также хотеть установить
fillMode
свойство кkCAFillModeBackwards
. Даже если расположенный на слое объект в дереве уровня содержит различное значение, этот режим заливки заставляет уровень отображать значение запуска анимации. Без этого режима заливки Вы видели бы переход к окончательному значению перед выполнением запусков анимации. Другие режимы заливки доступны также.autoreverses
свойство заставляет анимацию выполняться на указанное время и затем возвращаться к начальному значению анимации. Можно объединить это свойство сrepeatCount
свойство для анимации назад и вперед между запуском и значениями конца. Установка повторного счета к целому числу (такой как 1,0) для автообратной анимации заставляет анимацию останавливаться на ее начальном значении. Добавление дополнительной половины шага (такого как повторный счет 1,5) заставляет анимацию останавливаться на ее значении конца.Используйте
timeOffset
свойство с анимациями группы для запуска некоторых анимаций в более позднее время, чем другие.
Приостановка и возобновление анимаций
Для приостановки анимации можно использовать в своих интересах факт, что уровни принимают CAMediaTiming
протокол и набор скорость анимаций уровня к 0.0
. Установка скорости для обнуления приостанавливает анимацию, пока Вы не возвращаете значение к ненулевому значению. Перечисление 5-4 показывает простой пример того, как и приостановить и возобновить анимации позже.
Приостановка перечисления 5-4 и возобновление анимаций уровня
-(void)pauseLayer:(CALayer*)layer { |
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; |
layer.speed = 0.0; |
layer.timeOffset = pausedTime; |
} |
-(void)resumeLayer:(CALayer*)layer { |
CFTimeInterval pausedTime = [layer timeOffset]; |
layer.speed = 1.0; |
layer.timeOffset = 0.0; |
layer.beginTime = 0.0; |
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; |
layer.beginTime = timeSincePause; |
} |
Явные транзакции позволяют Вам изменить параметры анимации
Каждое изменение, которое Вы вносите в уровень, должно быть частью транзакции. CATransaction
класс управляет созданием и группировкой анимаций и их выполнения в подходящее время. В большинстве случаев Вы не должны создавать свои собственные транзакции. Базовая Анимация автоматически создает неявную транзакцию каждый раз, когда Вы добавляете явные или неявные анимации к одному из Ваших уровней. Однако можно также создать явные транзакции для управления теми анимациями более точно.
Вы создаете и управляете транзакциями с помощью методов CATransaction
класс. Запуститься (и неявно создать) новый вызов транзакции begin
метод класса; для окончания той транзакции вызовите commit
метод класса. Промежуточный те вызовы являются изменениями, что Вы хотите быть частью транзакции. Например, для изменения двух свойств уровня Вы могли использовать код в Перечислении 5-5.
Перечисление 5-5 , Создающее явную транзакцию
[CATransaction begin]; |
theLayer.zPosition=200.0; |
theLayer.opacity=0.0; |
[CATransaction commit]; |
Одна из главных причин использовать транзакции - то, что в ограничениях явной транзакции, можно изменить продолжительность, синхронизировав функцию и другие параметры. Можно также присвоить блок завершения всей транзакции так, чтобы приложение могло быть уведомлено, когда заканчивается группа анимаций. Изменение параметров анимации требует изменения надлежащего ключа в словаре транзакции с помощью setValue:forKey:
метод. Например, для изменения продолжительности по умолчанию на 10 секунд Вы изменились бы kCATransactionAnimationDuration
ключ, как показано в Перечислении 5-6.
Перечисление 5-6 , Изменяющее продолжительность по умолчанию анимаций
[CATransaction begin]; |
[CATransaction setValue:[NSNumber numberWithFloat:10.0f] |
forKey:kCATransactionAnimationDuration]; |
// Perform the animations |
[CATransaction commit]; |
Можно вложить транзакции в ситуациях, где Вы хотите обеспечить различные значения по умолчанию для различных наборов анимаций. Для вложения одной транзакции в другом просто вызовите begin
метод класса снова. Каждый begin
вызов должен быть соответствующим соответствующим вызовом к commit
метод. Только после фиксации изменений для наиболее удаленной транзакции, действительно Удаляет сердцевину Анимации, начинают связанные анимации.
Перечисление 5-7 показывает пример одной транзакции, вложенной в другом. В этом примере внутренняя транзакция изменяет тот же параметр анимации как внешняя транзакция, но использует различное значение.
Явные транзакции Вложения перечисления 5-7
[CATransaction begin]; // Outer transaction |
// Change the animation duration to two seconds |
[CATransaction setValue:[NSNumber numberWithFloat:2.0f] |
forKey:kCATransactionAnimationDuration]; |
// Move the layer to a new position |
theLayer.position = CGPointMake(0.0,0.0); |
[CATransaction begin]; // Inner transaction |
// Change the animation duration to five seconds |
[CATransaction setValue:[NSNumber numberWithFloat:5.0f] |
forKey:kCATransactionAnimationDuration]; |
// Change the zPosition and opacity |
theLayer.zPosition=200.0; |
theLayer.opacity=0.0; |
[CATransaction commit]; // Inner transaction |
[CATransaction commit]; // Outer transaction |
Добавление перспективы к анимациям
Приложения могут управлять уровнями в трех пространственных размерностях, но для Ядра простоты Анимация выводит на экран уровни с помощью параллельной проекции, по существу сглаживающей сцену в двухмерную плоскость. Это поведение по умолчанию вызывает тождественно измеренные уровни с различным zPosition
значения для появления как тот же размер, даже если они находятся далеко друг от друга на оси z. Перспективы, что у Вас обычно был бы просмотр такой сцены в трех измерениях, не стало. Однако можно изменить то поведение путем изменения матрицы преобразования уровней для включения информации о перспективе.
При изменении перспективы сцены необходимо изменить sublayerTransform
матрица суперуровня, содержащего просматриваемые уровни. Изменение суперуровня упрощает код, который необходимо записать путем применения той же информации о перспективе ко всем дочерним уровням. Это также гарантирует, что перспектива применяется правильно к одноуровневым подуровням, перекрывающим друг друга в различных плоскостях.
Перечисление 5-8 показывает, что способ создать простую перспективу преобразовывает для родительского слоя. В этом случае пользовательское eyePosition
переменная указывает относительное расстояние вдоль оси z, от которой можно просмотреть уровни. Обычно Вы указываете положительное значение для eyePosition
сохранить уровни ориентировалось ожидаемым способом. В то время как меньшие значения вызывают более драматические визуальные различия между уровнями, большие значения приводят к более плоской сцене.
Перечисление 5-8 , Добавляющее перспективу, преобразовывает к родительскому слою
CATransform3D perspective = CATransform3DIdentity; |
perspective.m34 = -1.0/eyePosition; |
// Apply the transform to a parent layer. |
myParentLayer.sublayerTransform = perspective; |
Со сконфигурированным родительским слоем можно измениться zPosition
свойство любых дочерних уровней и наблюдает, как их размер изменяется на основе их относительного расстояния от позиции наблюдателя.