自定义 UIView 作为 navigationItem 标题

Custom UIView as navigationItem title

我想创建简单的自定义视图并将其用于 navigationItem.titleView。我的自定义视图非常简单,只有图像视图和标签:[图像]-[标签]。我有 xib 文件,我在其中定义了所有约束(两个子视图都对超级视图有约束 - 我想子视图的高度和宽度确定整个自定义视图的高度和宽度)。问题是当我像这样从 xib 实例化视图时:

class func titleViewWithTitle(title: String, icon: UIImage?) -> TitleView {
        let titleView = NSBundle.mainBundle().loadNibNamed("TitleView", owner: self, options: nil).first as TitleView       
        titleView.title.text = title
        titleView.icon.image = icon
        titleView.layoutSubviews()
        return titleView
    }

此视图的大小不是由它 children 决定的。它具有在 Interface Builder 中手动设置的大小。我该怎么做才能强制视图动态计算大小?

在您的自定义视图中,覆盖 layoutSubviews 方法并添加:

CGSize targetSize = [self     systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];

从中创建一个 CGRectFrame 并将此框架设置为自己的新框架(这是自定义视图)。

这基本上会找到尽可能小的框架,该框架仍以显示所有内容的方式包含其内容。

注意:此自定义视图的所有子视图都必须正确设置自动布局压缩阻力。 IE。他们必须抵抗萎缩。