Что такое intrinsicContentSize в UIKit?

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

Ответ

Intrinsic Content Size — это естественный, "желаемый" размер UIView, определяемый её внутренним содержимым, а не внешними ограничениями (constraints).

Как работает:

  • Компоненты вроде UILabel, UIButton или UIImageView автоматически вычисляют свой размер на основе текста, шрифта, изображения и т.д.
  • Кастомная UIView может переопределить свойство intrinsicContentSize, чтобы сообщать системе о своём предпочтительном размере.
// Пример с UILabel
let label = UILabel()
label.text = "Hello"
label.font = .systemFont(ofSize: 20)
print(label.intrinsicContentSize) // Например, (52.0, 24.2)

// Переопределение в кастомной вью
class CustomView: UIView {
    override var intrinsicContentSize: CGSize {
        return CGSize(width: 100, height: 50)
    }
}

Взаимодействие с Auto Layout:

  • Система автоматически создаёт неявные ограничения (UIView-Encapsulated-Layout-Width/Height) на основе intrinsicContentSize.
  • Это позволяет задавать только позицию (например, leading и top constraints), а размер будет взят из внутреннего содержимого.
  • Если у вью нет внутреннего содержимого (например, базовый UIView), её intrinsicContentSize возвращает UIView.noIntrinsicMetric.

Важно: Приоритет этих неявных ограничений можно настроить через setContentHuggingPriority(_:for:) и setContentCompressionResistancePriority(_:for:).