Ответ
Свойства frame и bounds определяют геометрию слоя, но в разных системах координат.
frame (рамка):
- Определяет положение и размер слоя относительно системы координат его родительского слоя (superlayer).
- Это вычисляемое свойство. Его значение производно от
bounds,positionиanchorPoint. - Изменение
frameприводит к изменениюbounds.sizeиposition.
bounds (границы):
- Определяет внутреннюю систему координат слоя (обычно начало
(0,0)в его левом верхнем углу) и его размер. bounds.originиспользуется для прокрутки или смещения внутреннего содержимого слоя (например, изображения). Изменениеbounds.originне влияет на положение слоя (frameостается прежним).
Ключевые отличия на практике:
let layer = CALayer()
// Устанавливаем положение и размер в родительской системе координат
layer.frame = CGRect(x: 50, y: 50, width: 200, height: 100)
// Внутренние координаты и размер. Обычно origin = (0,0)
print(layer.bounds) // CGRect(x: 0, y: 0, width: 200, height: 100)
// Сдвигаем внутреннюю систему координат. Содержимое (например, дочерние слои)
// будет отрисовываться со смещением, но сам слой не двигается.
layer.bounds.origin = CGPoint(x: 20, y: 10)
print(layer.frame) // Остается (50, 50, 200, 100)!
Правило: Используйте frame для позиционирования слоя относительно родителя. Используйте bounds и position для точного контроля над геометрией и внутренним содержимым.