В чем разница между свойствами frame и bounds у CALayer?

«В чем разница между свойствами frame и bounds у CALayer?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Свойства 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 для точного контроля над геометрией и внутренним содержимым.