Ответ
bounds описывает внутреннюю систему координат view (относительно себя), а frame — ее положение и размер в системе координат супервью. bounds может стать больше frame в следующих случаях:
-
Применение аффинных трансформаций (
transform). Это самый частый случай. Трансформация (масштабирование, поворот) меняет видимое содержимое, но не меняетframe(который становится "недействительным"). Система увеличиваетbounds, чтобы вместить трансформированное содержимое.// frame останется (0, 0, 100, 100), но bounds станет больше view.transform = CGAffineTransform(scaleX: 2.0, y: 2.0) -
Изменение
anchorPointслоя (layer.anchorPoint). Смещает точку привязки для трансформаций, что может привести к расхождению междуboundsиframe. -
Когда subview выходит за границы superview с
clipsToBounds = false. Это не меняетboundsсамого view, но является смежным случаем, иллюстрирующим разницу между внутренними (bounds) и внешними (frame) координатами.
Ключевой вывод: Если к view применена неединичная трансформация, всегда работайте с bounds и center для манипуляций размещением и размером. Свойство frame в этом случае вычисляется системой и может давать неожиданные значения.