Каковы различия между UIView и CALayer?

оба имеют большинство одинаковых атрибутов, оба поддерживают различные виды анимации, оба представляют разные данные. Каковы различия между UIView и CALayer?

5 ответов


в iOS каждый UIView поддерживается основным анимационным CALayer, поэтому вы имеете дело с CALayers при использовании UIView, даже если вы этого не понимаете. В отличие от NSViews на Mac, которые развивались до того, как существовала основная анимация, UIViews предназначены для легких оболочек вокруг этих CALayers.

Как я описываю в аналогичном вопросе " когда использовать CALayer на Mac / iPhone?", работа непосредственно с CALayers не дает вам значительной производительности преимущества перед UIViews. Одна из причин, по которой вы можете захотеть создать элемент пользовательского интерфейса с CALayers вместо UIViews, заключается в том, что его можно очень легко портировать на Mac. UIViews сильно отличаются от NSViews, но CALayers почти идентичны на двух платформах. Вот почему базовая структура графика выкладывает свои графики с использованием CALayers вместо других элементов пользовательского интерфейса.

одна вещь, которую UIViews предоставляет через CALayers, - это встроенная поддержка взаимодействия с пользователем. Они справляются хит-тестирование касаний и других связанных действий, которые вам нужно будет построить самостоятельно, если вы управляете иерархией CALayers. Это не так сложно реализовать самостоятельно, но это дополнительный код, который вам нужно будет написать при создании интерфейса CALayer.

вам часто понадобится доступ к базовым слоям для UIView при выполнении более сложных анимаций, чем позволяет базовый класс UIView. Возможности анимации UIView выросли по мере созревания iOS SDK, но есть еще несколько вещей, которые лучше всего делать, взаимодействуя с лежащим в основе CALayer.


из блога Рэй Вендерлих (учебник)

CALayers-это просто классы, представляющие прямоугольник на экране с визуальным содержанием. "Но подождите минутку, - скажете вы, - это для чего нужны UIViews!- Это правда, но в этом есть хитрость . : каждый UIView содержит корневой слой, к которому он обращается!


проще говоря, UIView наследует от UIResponder, обрабатывает события от пользователей, содержит CALayer, которые наследуют от NSObject, в основном фокусируются на рендеринге, анимации и т. д.


UIView является контейнером для CALayers. Используя UIKit.

CALayer где мы рисуем содержимое. Используя CoreGraphics

если вы работаете с пользовательским управлением, как функции, было бы здорово идти вперед с одним видом, содержащим больше слоев для точного собственного рендеринга. С CALayers невесомы, чем UIView.

чтобы создать общий скелет для Mac и iOS, следуйте дизайну приложения с помощью CALayers. Поскольку он доступен в обеих платформах.

UIView имея функцию, как сенсорные события, достигнутые с помощью делегатов -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event, tochesStart событий, как и другие UIKit функции.

на работу с CALayers используйте основные графические знания.Для любого простого отображения вида UIView достаточно.


большая разница UIView предназначен для CocoaTouch на мобильном устройстве. Он добавляет некоторый обработчик событий, который CALayer не предоставил.