利用内在内容大小

在创建 UIView 子类时,内在内容大小有助于避免设置硬编码的高度和宽度约束

一个类如何利用这一点的基本一瞥

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)
    }
}

如果你只想本质地提供一个大小,则可以为要忽略的值提供值 UIViewNoIntrinsicMetric

 override func intrinsicContentSize() -> CGSize {
     return CGSize(width: UIViewNoIntrinsicMetric, height: image.size.width)   
 }

与 AutoLayout 和 Interface Builder 一起使用时的好处

可以使用此 ImageView(或 UIImageView)并将水平对齐设置为超视图中心 X,并将垂直对齐设置为超视图中心 Y.

StackOverflow 文档

接口构建器将在此时向你发出警告,提出以下警告:

StackOverflow 文档

这就是 Placeholder Intrinsic Size 的用武之地。

进入大小检查器面板,然后进入内在大小下拉列表,可以将此值从默认切换为占位符

StackOverflow 文档

现在,界面构建器将删除以前的警告,你可以使用此大小来在界面构建器中显示动态大小的视图。