Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Когда использовать свойство bounds UIView
bounds — это одно из ключевых геометрических свойств любого UIView (или CALayer), определяющее его внутреннюю систему координат. В отличие от frame, которое описывает положение и размер представления в системе координат его супервью (родительского view), bounds описывает положение и размер относительно собственной внутренней системы координат. Его прямоугольник почти всегда начинается с точки (0, 0) (origin), а размер (size) равен внутреннему содержимому представления.
Основные случаи использования bounds
Использование bounds становится необходимым или предпочтительным в следующих ситуациях:
1. Работа с внутренним содержимым и субвью (subviews)
Когда вы добавляете, располагаете или трансформируете субвью внутри родительского представления, вы должны использовать его bounds. Координаты субвью задаются относительно внутреннего пространства родителя.
let childView = UIView()
parentView.addSubview(childView)
// Положение childView задается относительно origin (0,0) родителя
childView.frame = CGRect(x: 20, y: 20, width: Pm100, height: 100)
// Здесь используются координаты из parentView.bounds
2. Обработка касаний (touch handling) и система координат событий
В методах обработки событий, таких как touchesBegan(_:with:), координаты касаний предоставляются относительно bounds того представления, в котором произошло событие. Для корректной интерпретации позиции касания внутри view необходимо сравнивать ее с bounds.
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let locationInView = touch.location(in: self)
// locationInView находится в системе координат self.bounds
if self.bounds.contains(locationInView) {
// Обрабатываем касание внутри view
}
}
}
3. Вычисление и задание центра представления (center)
Свойство center задается относительно bounds супервью, но логически связано с собственным bounds. Например, чтобы установить view точно в центр своего супервью, вы часто используете половину размеров bounds супервью.
subview.center = CGPoint(
x: superview.bounds.midX,
y: superview.bounds.midY
)
4. Когда view подвергается трансформациям (transform)
Если к представлению применена аффинная трансформация (например, rotation, scale), его frame становится неопределенным или вычисляется автоматически системой и может давать неожиданные значения. В таком случае bounds остается надежным источником информации о внутренних размерах view до трансформации.
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
view.transform = CGAffineTransform(rotationAngle: .pi / 4)
// view.frame теперь может быть другим (больше из-за вращения)
// Но view.bounds остается CGRect(0, 0, 100, 100)
print(view.bounds) // (0.0, 0.0, 100.0, 100.0)
5. Отрисовка контента в drawRect или работа с Core Graphics
При перерисовке контента внутри метода draw(_:) (или в контексте Core Graphics) вы работаете в системе координат, определенной bounds. Графические операции выполняются относительно его origin и размеров.
override func draw(_ rect: CGRect) {
let context = UIGraphicsGetCurrentContext()
// rect обычно является частью self.bounds
let path = UIBezierPath(ovalIn: self.bounds)
context?.addPath(path.cgPath)
}
Ключевые различия frame и bounds
frame: Используется для задания положения view относительно его родителя (супервью). Изменениеframeвлияет наcenterиbounds.size.bounds: Используется для всего, что происходит внутри view: расположение субвью, обработка событий, отрисовка. Изменениеbounds.sizeвлияет наframe.size, изменениеbounds.originсдвигает внутреннюю систему координат, что приводит к визуальному перемещению всего содержимого (субвью, рисунков) внутри view.
Практическое правило
- Если вы работаете с внешним расположением view (где оно находится на экране относительно других view) — используйте
frame(или часто лучшеcenterиbounds.sizeдля изменения размера). - Если вы работаете с внутренним содержимым view (добавление субвью, рисование, обработка касаний) — всегда используйте
bounds.
Таким образом, bounds — это фундаментальное свойство для понимания системы координат внутри UIView, и его правильное использование обеспечивает корректное расположение контента и обработку взаимодействий.