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 并将navigationItem
的titleView
设置为该图像视图,这似乎要容易得多。为了正确显示尺寸,您必须将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,约束,视图层次结构没有为约束做好准备的主要内容,如果未能解决你的问题,请参考以下文章