← Назад к вопросам

Что хранится в Bounds?

1.0 Junior🔥 171 комментариев
#UIKit и верстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что хранится в 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:

  1. Отрисовка и layout подviewsbounds определяет "холст" для добавления subviews и рисования. Например:

    let subview = UIView(frame: CGRect(x: 20, y: 20, width: 50, height: 50))
    view.addSubview(subview)
    // Положение subview (20, 20) интерпретируется относительно origin bounds родителя
    
  2. Скроллинг и смещение содержимого — изменение bounds.origin смещает внутреннее содержимое:

    // Эмулируем скроллинг на 30 точек вправо и 50 вниз
    view.bounds.origin = CGPoint(x: -30, y: -50)
    // Теперь subview визуально сместится в противоположном направлении
    
  3. Преобразования (transform)frame становится неопределённым при применении transform, а bounds остаётся стабильным:

    view.transform = CGAffineTransform(rotationAngle: .pi / 6)
    // frame изменится (может стать больше), bounds останется (0, 0, 200, 100)
    
  4. Обработка касаний — система проверяет, попадает ли точка касания в bounds view (с учётом 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).