Анимация Core Animation

Cocoa

Анимация является одним из ключевых элементов пользовательских интерфейсов сегодняшнего. Использование анимации Core Animation полностью автоматизировано. Не существует анимационных циклов или таймеров. Ваше приложение не несет ответственности за отображение кадра за кадром, или отслеживание текущего состояния анимации. Анимация происходит автоматически в отдельном потоке, без дальнейшего взаимодействия с приложением.

Классы анимации и синхронизация

Core Animation обеспечивает выразительный набор классов анимации, которые можно использовать в приложении:

  • CABasicAnimation обеспечивает простую интерполяцию между значениями для слоя.
  • CAKeyframeAnimation обеспечивает поддержку анимации по ключевым кадрам. Вы указываете путь к разделу свойств слоя для анимации, массив значений, которые представляют значения на каждом этапе анимации, а также массивы ключевых моментов кадра и функции синхронизации. Поскольку выполняется анимация, каждое значение устанавливается, в свою очередь с помощью заданной интерполяции.
  • CATransition обеспечивает эффект перехода, который влияет на контент всего слоя. Он исчезает, толкает, или раскрывает содержимое слоя при анимации. Последствия перехода может быть продлены путем предоставления собственных фильтров Core Image.
  • CAAnimationGroup позволяет создать массив анимрованных объектов, которые будут сгруппированы вместе и работать одновременно.

В дополнение к указанию типа анимации для выполнения, необходимо также указать продолжительность анимации, темп (как интерполированные значения распределяются по длительности), повторить ли анимацию и сколько раз, следует ли автоматически обратная когда каждый цикл завершается, и ее визуальное состояние, когда анимация завершена. Классы анимации и протокол CAMediaTiming предоставляют все эти функции и многое другое.

Неявные анимации

Неявная модель анимации Core Animation предполагает, что все изменения в анимируемых свойствах слоя должны быть постепенным и асинхронными. Динамически анимированные сцены могут быть достигнуты без какой-либо явной анимации слоев. Изменение значения анимируемых свойств слоя призывает слой неявно оживить переход от старого значения к новому. Хотя анимация на лету, установка нового целевого значения, приводит к тому, что анимация переходит к новому целевому значению от его текущего состояния.

Листинг 1 Неявная анимация свойства позиции слоя

// Предположим, что текущее положение слоя в (100.0,100.0)
theLayer.position=CGPointMake(500.0,500.0);

Вы можете оживить неявно одно свойство слоя за один раз, или много. Вы можете также косвенно оживить несколько слоев одновременно. Код в листинге 2 приводит четыре неявных анимации, происходящих одновременно.

Листинг 2 Неявная анимация нескольких свойств из нескольких слоев

// анимация theLayer's непрозрачность до 0 при отдалении в слое
theLayer.opacity=0.0;
theLayer.zPosition=-100;

// анимация anotherLayer непрозрачность до 1 при приближении в слое
anotherLayer.opacity=1.0;
anotherLayer.zPosition=100.0;

Неявные анимации используют длительность действия, указанную для свойства анимации по умолчанию, если длительность не была переопределена в явной или неявной транзакции.

Явные анимации

Core Animation также поддерживает модель явной анимации. Явная модель анимации требует создания объекта анимации и установления начальных и конечных значений. Явная анимация не начнется до того, как вы примените анимацию слоя. Фрагмент кода в листинге 3, создает явную анимацию, переходы прозрачности слоя в полностью непрозрачный и обратно в течение 3 секунд. Анимация не начинается, пока не будет добавлена к слою.

Листинг 3 Явные анимации

CABasicAnimation *theAnimation;

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=3.0;
theAnimation.repeatCount=2;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
theAnimation.toValue=[NSNumber numberWithFloat:0.0];
[theLayer addAnimation:theAnimation forKey:@"animateOpacity"];

Явные анимации особенно полезны при создании анимаций, которые работают постоянно. В листинге 4 показано, как создать явную анимацию, которая применяет CoreImage к цвету фильтра слоя, оживляя его интенсивность. Это приводит к желанию "выбрать слой", привлекая внимание пользователя.

Листинг 4 Пример непрерывной явной анимации

// Выбранный слой будет пульсировать непрерывно
//Это достигается путем установки bloom фильтра к слою, 

// создаем фильтр и установливаем его значение по умолчанию
CIFilter *filter = [CIFilter filterWithName:@"CIBloom"];
[filter setDefaults];
[filter setValue:[NSNumber numberWithFloat:5.0] forKey:@"inputRadius"];

// назовем фильтр, чтобы мы могли использовать ключевой путь для анимации inputIntensity

//атрибуты для фильтра
[filter setName:@"pulseFilter"];

// установим фильтр для  выбранного слоя из фильтров

[selectionLayer setFilters:[NSArray arrayWithObject:filter]];

// создадим анимацию, которая будет пульсировать.
CABasicAnimation* pulseAnimation = [CABasicAnimation animation];

// Атрибут, который мы хотим оживить - inputIntensity у pulseFilter

pulseAnimation.keyPath = @"filters.pulseFilter.inputIntensity";

// мы хотим анимировать со значения 0 до 1
pulseAnimation.fromValue = [NSNumber numberWithFloat: 0.0];
pulseAnimation.toValue = [NSNumber numberWithFloat: 1.5];

// длительность на одну секунду и запустить бесконечное количество раз

pulseAnimation.duration = 1.0;
pulseAnimation.repeatCount = HUGE_VALF;

// мы хотим, чтобы исчезло, и роявилось, так что он должен автоматически быть в Автореверсе .. 
// это приводит к тому, интенсивность меняется от 0 до 1 и до 0

pulseAnimation.autoreverses = YES;

// использовать временные кривые легко
pulseAnimation.timingFunction = [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseInEaseOut];

// добавим анимацию для выбранного слоя. Это приводит к тому, что начинается анимация.
// Мы будем использовать pulseAnimation как имя ключевой анимации

[selectionLayer addAnimation:pulseAnimation forKey:@"pulseAnimation"];

Запуск и остановка явной анимации

Вы начинаете явную анимацию, отправив сообщение addAnimation:forKey: в целевой слой, передавая анимацию и идентификатор в качестве параметра. После добавления к целевому слою явная анимация будет работать до завершения анимации, либо удаления из слоя. Идентификатор используется для добавления анимации к слою, а также используется, чтобы остановить ее, ссылаясь на removeAnimationForKey:. Вы можете остановить все анимации для слоя, отправив слою сообщение removeAllAnimations.

 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac