When creating a UIView subclass, intrinsic content size helps to avoid setting hardcoded height and width constraints
a basic glimpse into how a class can utilize this
class ImageView: UIView {
var image: UIImage {
didSet {
invalidateIntrinsicContentSize()
}
}
// omitting initializers
// convenience init(image: UIImage)
override func intrinsicContentSize() -> CGSize {
return CGSize(width: image.size.width, height: image.size.height)
}
}
If you only want to provide one size intrinsically, you can provide the value UIViewNoIntrinsicMetric
for the value that you wish to ignore.
override func intrinsicContentSize() -> CGSize {
return CGSize(width: UIViewNoIntrinsicMetric, height: image.size.width)
}
Benefits when using with AutoLayout and Interface Builder
One could take this ImageView (or UIImageView) and set the horizontal alignment to superview center X and the vertical alignment to superview center Y.
Interface builder will complain to you at this point giving the following warning:
This is where Placeholder Intrinsic Size
comes in.
Going into the Size inspector panel, and down to the Intrinsic Size dropdown, you can switch this value from Default to Placeholder.
and now interface builder will remove the previous warnings and you can use this size to have dynamically sized views laid out in interface builder.