В чем разница между UIView и CALayer?


103

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

Ответы:


224

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

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

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

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


40

Из блога Рэя Вендерлиха ( Учебник )

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


33

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


7

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

CALayerгде мы рисуем содержимое. С помощьюCoreGraphics

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

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

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

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


0

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


0

UIView: представления имеют более сложные иерархические схемы. Они могут получать взаимодействия с пользователем, такие как нажатия, щипки, щелчки и многое другое. Работа с UIViews происходит в основном потоке, это означает, что он использует мощность процессора.

CALayer: С другой стороны, слои имеют более простую иерархию. Это означает, что они быстрее разрешаются и быстрее рисуются на экране. В отличие от представлений, нет накладных расходов на цепочку респондентов. Слои рисуются прямо на графическом процессоре. Это происходит в отдельном потоке без нагрузки на ЦП.

Подробнее: https://medium.com/@fassko/uiview-vs-calayer-b55d932ff1f5

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.