Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что хранится в bounds?
bounds — это свойство класса UIView (и его наследников, включая UIWindow и CALayer), которое определяет прямоугольную область в собственной системе координат view. В отличие от frame, который задаёт положение и размер view относительно системы координат родительского view, bounds работает исключительно внутри самого view.
Ключевые характеристики bounds:
origin(точкаCGPoint) — обычно равен(0, 0). Определяет смещение внутренней системы координат view. Изменениеoriginвлияет на отрисовку содержимого (например, скроллинг).size(размерCGSize) — определяет внутреннюю область view, в которой происходит отрисовка (drawing bounds). Совпадает с размеромframe, если нет преобразований (rotation, scale).
Пример кода и сравнение с frame:
let view = UIView(frame: CGRect(x: 50, y: 50, width: 200, height: 100))
// frame: (50.0, 50.0, 200.0, 100.0) — относительно родителя
// bounds: (0.0, 0.0, 200.0, 100.0) — собственная система координат
print("Frame: \(view.frame)")
print("Bounds: \(view.bounds)")
Практическое значение bounds:
-
Отрисовка и layout подviews —
boundsопределяет "холст" для добавления subviews и рисования. Например:let subview = UIView(frame: CGRect(x: 20, y: 20, width: 50, height: 50)) view.addSubview(subview) // Положение subview (20, 20) интерпретируется относительно origin bounds родителя -
Скроллинг и смещение содержимого — изменение
bounds.originсмещает внутреннее содержимое:// Эмулируем скроллинг на 30 точек вправо и 50 вниз view.bounds.origin = CGPoint(x: -30, y: -50) // Теперь subview визуально сместится в противоположном направлении -
Преобразования (transform) —
frameстановится неопределённым при примененииtransform, аboundsостаётся стабильным:view.transform = CGAffineTransform(rotationAngle: .pi / 6) // frame изменится (может стать больше), bounds останется (0, 0, 200, 100) -
Обработка касаний — система проверяет, попадает ли точка касания в
boundsview (с учётомclipsToBounds).
Важные нюансы:
boundsне включает в себя трансформы — он всегда описывает прямоугольник в непреобразованной системе координат view.- Изменение
bounds.sizeмасштабируетframe(и наоборот), так как они связаны черезcenterиtransform:view.bounds.size.width *= 2 // frame.width также удвоится (если нет transform) bounds.originполезен для кастомного скроллинга — вUIScrollViewименно черезboundsреализован механизм прокрутки.
Типичные сценарии использования:
- Кастомное рисование в
draw(_:)— используйтеboundsдля определения области отрисовки. - Расчёт layout в
layoutSubviews()— позиционируйте subviews относительноbounds. - Создание snapshot view — захват содержимого в границах
bounds. - Hit-testing — проверка, находится ли точка внутри
bounds(с учётомinsetsилиclipsToBounds).
Заключение:
Понимание разницы между frame и bounds критично для корректной работы с геометрией в iOS. bounds — это "взгляд изнутри" view на свою собственную систему координат, тогда как frame — это "взгляд снаружи" родителя на положение и размер дочернего view. Изменение bounds влияет на внутреннее содержимое, но не меняет положение view в иерархии (за это отвечает frame).