Может ли высота `frame` UIView быть меньше высоты его `bounds`?

«Может ли высота `frame` UIView быть меньше высоты его `bounds`?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, не может. Система UIKit автоматически синхронизирует эти значения. Если вы попытаетесь установить frame.size.height меньше, чем текущая bounds.size.height, система изменит bounds.size.height, чтобы она соответствовала новой высоте frame.

Объяснение:

  • frame — прямоугольник, определяющий положение и размеры view в системе координат его супервью (родителя).
  • bounds — прямоугольник, определяющий видимую область view в его собственной системе координат (часто с началом в (0, 0)).

Пример, демонстрирующий синхронизацию:

let view = UIView()
// Изначально frame и bounds равны
view.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
print(view.bounds) // (0.0, 0.0, 100.0, 100.0)

// Пытаемся установить bounds больше frame
view.bounds = CGRect(x: 0, y: 0, width: 150, height: 150)
print(view.bounds) // (0.0, 0.0, 100.0, 100.0) - bounds УСЕЧЕНЫ до frame!

// Меняем frame (уменьшаем высоту)
view.frame.size.height = 50
print(view.bounds) // (0.0, 0.0, 100.0, 50.0) - bounds.height изменилась вслед за frame.height

Практический вывод: Нельзя использовать bounds для «масштабирования» контента внутри view. Для этого следует использовать преобразования (transform) или менять frame/bounds супервью.