Swift,约束,视图层次结构没有为约束做好准备

Posted

技术标签:

【中文标题】Swift,约束,视图层次结构没有为约束做好准备【英文标题】:Swift, Constraint, The view hierarchy is not prepared for the constraint 【发布时间】:2014-12-14 02:10:27 【问题描述】:

我正在尝试在导航控制器中添加图像并将其居中。所以我确实有一个imageView 和一个UINavigationBar,我想将图像视图添加到该导航栏并将其水平居中。 UINavigationBar 来自 UINavigationController。我不断收到以下错误:

视图层次结构没有为约束做好准备: 添加到视图时,约束的项必须是该视图(或视图本身)的后代。如果在组装视图层次结构之前需要解决约束,这将崩溃。中断 -[UIView _viewHierarchyUnpreparedForConstraint:] 进行调试。

我尝试了不同的方法,但唯一有效的方法是在 self.view 中设置 imageView 并将约束添加到 self.view

let bar: UINavigationBar = self.navigationController!.navigationBar

let logo = UIImage(named: "logo-horizontal")
let imageView:UIImageView = UIImageView(image:logo)

imageView.setTranslatesAutoresizingMaskIntoConstraints(false)
imageView.frame.size.width = 100;
imageView.frame.size.height = 31;

bar.addSubview(imageView)

imageView.addConstraint(NSLayoutConstraint(
    item: imageView,
    attribute: NSLayoutAttribute.CenterX,
    relatedBy: NSLayoutRelation.Equal,
    toItem: bar,
    attribute: NSLayoutAttribute.CenterX,
    multiplier: 1,
    constant: 0
))

【问题讨论】:

我刚刚发现this one 使用了不同的方法。你认为这是正确的方法吗? self.navigationItem.titleView = imageView; 您的错误原因是您将约束添加到imageView,这是导航栏的子视图,在约束中使用。您需要将约束添加到包含约束中引用的两个视图的视图。 【参考方案1】:

正如我在评论中所说,如果您创建一个 UIImageView 并将navigationItemtitleView 设置为该图像视图,这似乎要容易得多。为了正确显示尺寸,您必须将contentMode 设置为ScaleAspectFit,并将高度设置为“30”或您喜欢的任何高度。下面你可以看到我是怎么做到的。

let logoView:UIImageView = UIImageView(image: UIImage(named: "logo-filename"))
logoView.contentMode = UIViewContentMode.ScaleAspectFit
logoView.frame.size.height = 30
self.navigationItem.titleView = logoView

附言。我想您不必设置宽度,因为ScaleAspectFit

【讨论】:

以上是关于Swift,约束,视图层次结构没有为约束做好准备的主要内容,如果未能解决你的问题,请参考以下文章

视图层次结构没有为约束做好准备?

视图层次结构没有为约束做好准备

视图层次结构没有为约束做好准备:无法找到问题

uiscrollview的自动布局,视图层次结构没有为约束做好准备

在扩展中出现错误“视图层次结构没有为约束做好准备”

即使在添加子视图之后,视图层次结构也没有为约束做好准备