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

Приведи пример в рамках стандартных компомнентов, когда origin у bounds будет отличен от нуля

2.2 Middle🔥 191 комментариев
#UIKit и верстка

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

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

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

Пример использования bounds.origin в стандартных компонентах UIKit

В рамках стандартных компонентов UIKit свойство bounds.origin (координаты верхнего левого угла прямоугольника относительно его внутренней системы координат) часто отличается от нуля при выполнении операций скроллинга и трансформаций.

Основное отличие bounds от frame

  • frame определяет положение и размер view в системе координат родительского view (superview).
  • bounds определяет внутреннюю систему координат view, где bounds.origin может меняться, например, при скроллинге содержимого.

Конкретный пример: UIScrollView и его содержимое

Рассмотрим классический пример — UIScrollView, где изменение bounds.origin происходит автоматически при скроллинге.

import UIKit

class ScrollViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Создаем UIScrollView
        let scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))
        scrollView.contentSize = CGSize(width: 600, height: 600)
        
        // Добавляем UIView как содержимое
        let contentView = UIView(frame: CGRect(x: 0, y: 0, width: 600, height: 600))
        contentView.backgroundColor = .systemBlue
        
        scrollView.addSubview(contentView)
        self.view.addSubview(scrollView)
        
        // Проверяем bounds.origin до скроллинга
        print("Before scrolling: bounds.origin = \(scrollView.bounds.origin)")
        
        // Выполняем скролл на 100 точек по горизонтали
        scrollView.setContentOffset(CGPoint(x: 100, y: 0), animated: false)
        
        // Проверяем bounds.origin после скроллинга
        print("After scrolling: bounds.origin = \(scrollView.bounds.origin)")
    }
}

Результат выполнения кода:

Before scrolling: bounds.origin = (0.0, 0.0)
After scrolling: bounds.origin = (100.0, 0.0)

Почему bounds.origin изменяется в UIScrollView?

  • Когда пользователь скроллит содержимое, UIScrollView автоматически изменяет свой bounds.origin, чтобы "переместить" внутреннюю систему координат относительно содержимого.
  • Это позволяет дочерним view (например, contentView) оставаться в фиксированном положении внутри scrollView, а изменение bounds.origin создает эффект скроллинга.
  • Метод setContentOffset() напрямую влияет на bounds.origin, так как contentOffset и bounds.origin фактически синонимичны в UIScrollView.

Другие стандартные компоненты с измененным bounds.origin

  1. UITableView и UICollectionView — при скроллинге списков или коллекций их bounds.origin также изменяется аналогично UIScrollView.

  2. UIView с применением трансформаций — если к view применяется масштабирование (scale) или вращение (rotation), это может временно изменить bounds.origin для корректного отображения содержимого.

Важные технические детали

  • Изменение bounds.origin не влияет на положение дочерних view внутри родительского, поскольку они позиционируются относительно внутренних координат родителя.
  • При использовании Auto Layout изменение bounds.origin может потребовать пересчета layout, если используются constraints, зависящие от bounds.
  • Для корректной обработки событий касаний (hitTest) система учитывает bounds.origin, чтобы правильно определять попадание в область view.

Таким образом, изменение bounds.origin от нуля — это стандартный механизм UIKit для реализации скроллинга и управления внутренней геометрией view, особенно заметный в UIScrollView и его наследниках.

Приведи пример в рамках стандартных компомнентов, когда origin у bounds будет отличен от нуля | PrepBro