В UIKit, когда bounds view может быть больше, чем его frame?

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

Ответ

bounds описывает внутреннюю систему координат view (относительно себя), а frame — ее положение и размер в системе координат супервью. bounds может стать больше frame в следующих случаях:

  1. Применение аффинных трансформаций (transform). Это самый частый случай. Трансформация (масштабирование, поворот) меняет видимое содержимое, но не меняет frame (который становится "недействительным"). Система увеличивает bounds, чтобы вместить трансформированное содержимое.

    // frame останется (0, 0, 100, 100), но bounds станет больше
    view.transform = CGAffineTransform(scaleX: 2.0, y: 2.0)
  2. Изменение anchorPoint слоя (layer.anchorPoint). Смещает точку привязки для трансформаций, что может привести к расхождению между bounds и frame.

  3. Когда subview выходит за границы superview с clipsToBounds = false. Это не меняет bounds самого view, но является смежным случаем, иллюстрирующим разницу между внутренними (bounds) и внешними (frame) координатами.

Ключевой вывод: Если к view применена неединичная трансформация, всегда работайте с bounds и center для манипуляций размещением и размером. Свойство frame в этом случае вычисляется системой и может давать неожиданные значения.