CoreAnimation: Layer, View & Layer Trees
Основным объектом, с которым вы будете работать при использовании Core Animation являются слои (layers).
Layer содержит контент, который вы хотите отобразить, и информацию о его параметрах, например: размер, масштаб, цвет фона, радиус углов, границы, тени. Этот контент представляет собой растровое изображение bitmap. Базовая функциональность обеспечивается классом CALayer, который является родительским классом для всех типов слоев Core Animation.
Bitmap слоя может быть создан:
• если присвоить какое-либо изображение свойству contents слоя (контент не меняется или меняется редко, само присваиваемое изображение должно иметь тип CGImageRef).
• можно назначить слою делегата, который и будет отрисовывать содержимое слоя (контент может периодически изменяться, а в роли делегата чаще всего используется view, чей контент и получает слой).
• создать свой подкласс и переопределить один из его методов: display или draw(in:).
Базовая анимация предоставляет несколько типов слоев по умолчанию, основными из которых являются:
CALayer: это базовый класс, который мы можем расширить для создания наших слоев.
CATextLayer: это слой, который предоставляет возможность визуализации текста из строки с возможностью установки некоторых атрибутов.
CAShapeLayer: это слой, который дает возможность рисовать фигуры, используя CGPath-объект.
CAGradientLayer: это слой, который предоставляет возможность создать градиент цвета, используя массив CGColorRef.
Как и view, слой имеет свойства frame и bounds:
frame - это расположение и размер представления с использованием системы координат родительского представления (используется для размещения представления в родительском)
bounds - местоположение и размер представления с использованием его собственной системы координат (используется для размещения содержимого представления или подпредставлений внутри него)
Но у слоя есть одно свойство, которого не имеет view - anchorPoint. Это свойство определяет точку внутри границ слоя, относительно которой происходит изменение его геометрических свойств. Оно измеряется в относительных единицах(минимальное значение равно 0, 0 и соответствует левому верхнему углу и совпадает с bounds.origin, максимальное значение равно 1, 1 и совпадает с правым нижним углом). По умолчанию равно 0.5, 0.5, что соответствует центру прямоугольника, заданного свойством bounds.
Cвойство position обычно используется для определения положения слоя и задается в points. Position указывает положение anchorPoint в родительской системе координат. Хотя у слоя и есть свойство frame, оно является комбинацией bounds и position и используется гораздо реже. Изменение anchorPoint влечет за собой изменение frame и перемещение layer.
У каждого слоя имеется две матрицы преобразования transform matrix, которые позволяют оперировать слоями в трехмерном пространстве. Они являются экземплярами класса CATransform3D. Первая – свойство transform. Оно определяет преобразования, которые применяются к самому слою и его дочерним слоям. Это свойство можно использовать для масштабирования, поворота слоя или изменения его положения. Вторая - задается свойством sublayerTransform и определяет дополнительные преобразования, которые применяются только к дочерним слоям. В основном применяется для получения эффекта визуальной перспективы при отображении контента. Любые преобразования слоя с использованием одного из этих свойств осуществляются относительно его anchorPoint.
По умолчанию transform имеет значение identity, что означает отсутствие каких-либо преобразований над слоем.
Используя в своём приложении Core Animation, в нашем распоряжении имеется три набора слоев, каждый из которых играет свою роль в формировании контента на экране. Визуализировать это можно следующим образом:
• Model layer tree хранят конечные значения любых анимаций, то есть отображают объект в финальном состоянии, как будто анимация уже закончилась. Могут быть получены с помощью свойства model экземпляра класса CALayer.
• Presentation tree хранят текущие значения для анимаций, которые выполняются. Не рекомендуется менять или каким-либо иным образом воздействовать на эти объекты. Обычно presentation слои используются для чтения текущих значений анимации, например, для создания новой анимации, которая стартует с этих значений. Могут быть получены с помощью свойства presentation экземпляра класса CALayer.
• Объекты из render tree выполняют непосредственно анимации. С этими объектами работает только Core Animation.
На этом знакомство с теорией анимации и фреймворка Core Animation, на данном этапе, можно считать достаточным. Для лучшего понимания как это работает нужна практика, чтобы всё прочувствовать непосредственно собственными пальчиками и своим кодом. Читать и изучать теорию можно( и нужно!) вечно… в следующих статьях будем кодить и проверять всё на деле ????
В отличие от view, слой не обрабатывает касания, не участвует в responder chain.
Напомню перечень свойств, которые являются анимируемыми (см. AnimatableProperties).