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

Ответ

Нет, не может. Система 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 супервью.

Ответ 18+ 🔞

Да ты посмотри, какая забавная хуйня происходит с этими frame и bounds! Система, блядь, как хитрая жопа, сама всё синхронизирует, и попробуй её перехитрить.

Вот представь: frame — это как габариты твоей тачки на парковке супервью. А bounds — это внутренний обзор из окна этой самой тачки. Так вот, если ты вдруг решишь, что твоё окно (bounds) должно быть больше, чем сама тачка, система тебе вежливо, но жёстко намекнет: «Нет, мудила, так не пойдёт». Она просто обрежет твои bounds по размерам frame.

Смотри, как это на практике выглядит, ёпта:

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

// Пытаешься сделать bounds больше — надеешься на чудо?
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 послушно за ним уползла!

Так что практический вывод, блядь, простой, как три копейки: Не пытайся использовать bounds для какого-то там масштабирования контента внутри вьюхи — это тупик. Хочешь увеличить или уменьшить вид — юзай преобразования (transform) или меняй размеры родительского контейнера. А эта связка frame и bounds — они как сиамские близнецы, ебушки-воробушки, друг без друга нихуя.