, intrinsicContentSize , . , UIView:
, . , , .
MyView bounds , intrinsicContentSize, layoutSubviews(). intrinsicContentSize, , .
1: sizeThatFits(_:)
-, MyView :
func setupView() {
label = UILabel()
label.numberOfLines = 0
label.autoresizingMask = [.flexibleWidth]
addSubview(label)
}
override func layoutSubviews() {
super.layoutSubviews()
label.sizeToFit()
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
return label.sizeThatFits(size)
}
MyView label, (- .flexibleWidth) ( numberOfLines 0). MyView , sizeThatFits(_:).
-, , UITableView . , UITableView systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority) , sizeThatFits(_:) . (. WWDC 2014 Session 226.)
, , - . UILayoutPriorityRequired. , ( , ) .
myView:
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
return myView.sizeThatFits(targetSize)
}
.
2: intrinsicContentSize
MyView , . :
override func layoutSubviews() {
super.layoutSubviews()
label.frame = bounds
}
- MyView. ( ), - :
override var intrinsicContentSize: CGSize {
return CGSize(width: UIViewNoIntrinsicMetric, height: label.intrinsicContentSize.height)
}
, . , , UILabel , , .
preferredMaxLayoutWidth . UILabel :
// , -intrinsicContentSize
, - , preferredMaxLayoutWidth . intrinsicContentSize , , , :
override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize {
myView.label.preferredMaxLayoutWidth = targetSize.width
myView.invalidateIntrinsicContentSize()
return super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority)
}
MyView , MyView , preferredMaxLayoutWidth MyView .
, MyView intrinsicContentSize .