Какие элементы UIKit имеют собственный размер (intrinsicContentSize)?

«Какие элементы UIKit имеют собственный размер (intrinsicContentSize)?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Свойство intrinsicContentSize определяет естественный, «желаемый» размер элемента, основанный на его содержимом. Его имеют следующие элементы UIKit:

  • UILabel, UITextField, UITextView — размер вычисляется на основе текста, шрифта и атрибутов.
  • UIImageView — размер равен размеру его изображения (image.size).
  • UIButton — размер зависит от заголовка (title), изображения (image) и внутренних отступов (contentEdgeInsets).
  • Элементы управления с фиксированным размером: UISwitch, UISlider, UIStepper, UIActivityIndicatorView и другие.

Пример использования:

let label = UILabel()
label.text = "Hello, World!"
label.font = UIFont.systemFont(ofSize: 16)
print(label.intrinsicContentSize) // Например, (98.0, 20.0)
label.sizeToFit() // Изменяет frame в соответствии с intrinsicContentSize.

Важно:

  • Auto Layout использует intrinsicContentSize для расчета ограничений (constraints).
  • Для кастомного UIView можно переопределить свойство intrinsicContentSize, чтобы он сообщал системе свой естественный размер.
  • Если содержимое меняется (например, текст в UILabel), нужно вызвать invalidateIntrinsicContentSize(), чтобы система пересчитала layout.