2011-01-14 2 views
7

Предположим, я хочу добавить 50 изображений к виду с целью их анимации. Предположим, я планирую использовать Core Animation (например, CABasicAnimation), а не анимацию UIView.iOS: Должен ли я добавлять UIViews или CALayers для анимации?

Могу ли я реализовать это, добавив 50 подпунктов или 50 подслоев? Есть ли разница?

Спасибо.

ответ

16

Как я описываю here, я использовал оба UIViews и CALayers в анимации и нашел незначительную разницу в производительности между ними. UIViews - очень легкие обертки вокруг слоев. Кроме того, любые анимации на основе слоев могут быть легко применены к базовому слою UIView.

Я использовал CALayers непосредственно в ситуациях, когда я хотел создать элементы межплатформенного интерфейса (Mac/iOS), поскольку CALayers практически идентичны в своей реализации на обеих платформах (в отличие от существенно разных NSViews и UIViews). У CALayers нет никаких процедур обработки касаний из коробки, но вы можете добавить эту возможность, если вам нужно.

Есть также некоторые краевые случаи, где вы можете работать непосредственно со слоями, например, при попытке ограничить трехмерное манипулирование слоями (как в эффекте CoverFlow) или при использовании слоя CAReplicatorLayer для создания эффектов частиц.

+0

Я закончил работу с UIViews, в первую очередь потому, что анимация UIView с блоками намного проще реализовать в тех случаях, когда важно запускать анимацию/предпринимать действия последовательно. (Эти блоки завершения очень чисты, и использование вызова делегата «animationDidStop» станет кошмаром для реализации в моем конкретном случае.) –

+1

@Greg. Да, новые блочные анимации UIView довольно чисты. Однако вы можете получить аналогичные обратные вызовы завершения блока с помощью CAAnimations, используя «+ setCompletionBlock:» CATransaction, который будет выполнять блок по завершению всех анимаций, завернутых в эту транзакцию. Просто подумать о том, хотите ли вы пойти именно так. –

1

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

1

Разница для такого небольшого числа изображений незначительна. Используйте то, что наиболее удобно.

+0

В моих экспериментах я обнаружил, что около 50 изображений - это то, что я мог оживить, прежде чем я заикаюсь на iPhone 4. (Я могу только предположить, что это число сильно варьируется в зависимости от содержания/размера изображений, количества полупрозрачных слоев ниже анимированные изображения и т. д.) –

+0

И модель телефона: D – BallpointBen

0

Я еще не сделал анимацию (пока :-), но материал, который я помню, читал об этом, предлагает создать одно изображение со всеми 50 плиточными на нем, а затем просто смещаться к правильному изображению при рисовании. Таким образом вам нужен только один слой или UIImage или что-то еще, чтобы отобразить его. Я не знаю о скорости, но я бы предположил, что это сэкономит память и, вероятно, будет проще управлять и кодировать.

+0

Это обычно называется «спрайт» и применяется к анимации OpenGL, но на самом деле не применяется к CoreAnimation. –