Как получить динамическое представление, адаптирующее его фрейм к его содержимому?
Обычно нужно расположить представление с автоматическим макетом и переопределить intrinsicContentSize
, чтобы указать ширину и высоту на основе представлений содержимого (например, метки).Механизм автоматической разметки будет автоматически подчиняться intrinsicContentSize
.
Обратите внимание, что размер внутреннего содержимого магическим образом не знает своих собственных зависимостей;каждый раз, когда вы изменяете зависимость (например, текст метки), вам нужно вызывать invalidateIntrinsicContentSize
, чтобы снова вызывать intrinsicContentSize
для пересчета высоты и ширины.
В этом примере CustomViewкрасный вид и метка внутри него на белом фоне - это textLabel
.Обратите внимание, что красный вид автоматически расширяется и сжимается синхронно с автоматическим расширением и сжатием метки при изменении текста метки.
Этоочень простой пример для иллюстрации, поэтому моя реализация CustomView очень проста:
class CustomView : UIView {
@IBOutlet var textLabel : UILabel!
override var intrinsicContentSize: CGSize {
let w = self.textLabel.intrinsicContentSize.width + 40
let h = self.textLabel.intrinsicContentSize.height + 40
return CGSize(width: w, height: h)
}
}
А теперь кнопки просто говорят такие вещи:
self.customView.textLabel.text = // whatever
self.customView.invalidateIntrinsicContentSize()