Транзакции Core Animation

Cocoa

Любое изменение в слое является частью транзакции. CATransaction является классом Core Animation ответственным за дозирование нескольких деревьев слоев изменений в atomic обновлении для визуализации дерева.

Неявные транзакции

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

Пример в листинге 1 изменяет свойства слоя opacity, zPosition и position, опираясь на неявную транзакцию, чтобы убедиться, что в результате анимации происходят одновременно.

Листинг 1 анимация с помощью неявной транзакции

theLayer.opacity=0.0;
theLayer.zPosition=-200;
thelayer.position=CGPointMake(0.0,0.0);

Важно При изменении свойств слоев из потоков, которые не имеют runloop, вы должны использовать явные транзакции.

Явные транзакции

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

Временное отключение действий слоя

Вы можете временно отключить действия слоев при изменении значений свойств слоя, установив значение свойства kCATransactionDisableActions в истинное. Любые изменения, сделанные в рамках этой транзакции не приведут к появлению анимации. В листинге 2 показан пример, который отключает анимацию исчезновения, которая происходит при удалении из видимого дерева слоев aLayer.

Листинг 2 Временное отключение действия слоя

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];

Переопределение времени выполнения подразумеваемой анимации

Вы можете временно изменить продолжительность анимации, которая запускается в ответ на изменение значения свойства слоя, установив значение ключа транзакции kCATransactionAnimationDuration в новое значение. Любой результат анимации в этой транзакции будет использовать это значение, а не свое собственное. В листинге 3 показан пример, который приводит к анимации происходящей в течение 10 секунд, а не длительности указанной в zPosition и opacity анимации

Листинг 3 Переопределение продолжительности анимации

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:10.0f] forKey:kCATransactionAnimationDuration];
theLayer.zPosition=200.0;
theLayer.opacity=0.0;
[CATransaction commit];

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

Вложенные транзакции

Явные транзакции могут быть вложенными, что позволяет отключить действия для одной части анимации, или использовать различную длительность для свойств неявных анимаций, которые были изменены. Только тогда, когда внешняя, самая верхняя транзакция будет принята, произойдет анимация.

В листинге 4 показан пример вложенности двух транзакций. Внешняя транзакция устанавливает продолжительность анимации до 2 секунд и устанавливает свойство position слоя. Внутренняя транзакция устанавливает длительность анимации до 5 секунд и изменения свойств слоев opacity и zPosition.

Листинг 4 Вложенные явные транзакции

[CATransaction begin]; // внешняя транзакция

// изменяем продолжительность анимации до 2 секунд

[CATransaction setValue:[NSNumber numberWithFloat:2.0f] forKey:kCATransactionAnimationDuration];

// перемещаем слой в новую позицию
theLayer.position = CGPointMake(0.0,0.0);

[CATransaction begin]; // вложенная транзакция
//изменяем продолжительность анимации до 5 секунд
[CATransaction setValue:[NSNumber numberWithFloat:5.0f] forKey:kCATransactionAnimationDuration];

// изменяем zPosition и opacity
theLayer.zPosition=200.0;
theLayer.opacity=0.0;

[CATransaction commit]; // вложенная транзакция

[CATransaction commit]; // внешняя транзакция
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac