Я использую CATransition
для перетасовки CALayer
в UIView
(UIView
не в полноэкранном режиме). Новый слой входит справа, а старый слой уходит слева. Свойства содержимого CAlayer
имеют значение CGImageRef
s. Вот что я считаю подходящим кодом:
CATransition *transition = [CATransition animation];
transition.duration = transitionTime;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromRight;
transition.delegate = self;
[view.layer addAnimation:transition forKey:nil];
// onDeck is the layer stage-right and is about to enter
[view.layer addSublayer:onDeck];
// onStage is the layer currently in the middle of the view and is exiting
if (onStage)
[onStage removeFromSuperlayer];
Появляется эта анимация, есть пауза в 1 секунду, а затем новое изображение анимируется и т. Д., И т. Д. Это прекрасно работает в симуляторе, но на моем iPod Touch 2-го поколения в анимации иногда возникают сбои. В частности, слой, в котором выполняется анимация, будет мерцать поверх текущего отображаемого слоя. Эти мерцания непостоянны, но заметны.
Что я сузил до вероятных виновников, так это фоновые анимации, которые я использовал за этим переходом. Несколько десятков CAlayer
вылетают и выходят из полноэкранного режима на заднем плане. Когда я удаляю эти фоновые анимации или устанавливаю продолжительность анимации для перехода на гораздо большую продолжительность (2 секунды +), анимация работает нормально (я бы хотел, чтобы время анимации составляло 0,75 секунды).
Моя первая мысль (которая, кажется, подтверждается приведенными выше наблюдениями) заключается в том, что я слишком сильно нажимаю на CoreAnimation (по крайней мере, для моего iPod) и мне нужно идти на компромисс. Я не могу принять это из-за того, что сцена отображается очень хорошо (практически без задержек), если не считать этого случайного мерцания.
Если у кого-то есть какие-либо комментарии по этой проблеме или оптимизации CoreAnimation в целом, я был бы очень признателен!
Спасибо за чтение
Обновление:
Была возможность протестировать это на iPhone 4, и мерцания не произошло. Вдобавок инструмент CoreAnimation подтвердил, что на моем iPod Touch 2-го поколения я постоянно получаю от 40 до 50/50 FPS.