视图层次结构没有为约束做好准备
Posted
技术标签:
【中文标题】视图层次结构没有为约束做好准备【英文标题】:The view hierarchy is not prepared for the constraint 【发布时间】:2015-07-13 09:00:03 【问题描述】:我得到一个错误:
当我运行下面的代码时,我的每个约束都位于UIView
类中:
func addIcon(iconImage: UIImage)
// Creating imageView
var icon = UIImageView()
icon.image = iconImage
icon.contentMode = .ScaleAspectFit
// Adding to self
self.addSubview(icon)
// Setting constraints
setTranslatesAutoresizingMaskIntoConstraints(false)
var leading = NSLayoutConstraint(
item: icon,
attribute: .Leading,
relatedBy: .Equal,
toItem: self,
attribute: .Leading,
multiplier: 1,
constant: 8)
icon.addConstraint(leading)
var centerY = NSLayoutConstraint(
item: icon,
attribute: .CenterY,
relatedBy: .Equal,
toItem: self,
attribute: .CenterY,
multiplier: 1,
constant: 0)
icon.addConstraint(centerY)
var top = NSLayoutConstraint(
item: icon,
attribute: .Top,
relatedBy: .GreaterThanOrEqual,
toItem: self,
attribute: .Top,
multiplier: 1,
constant: 8)
icon.addConstraint(top)
var bottom = NSLayoutConstraint(
item: icon,
attribute: .Bottom,
relatedBy: .GreaterThanOrEqual,
toItem: self,
attribute: .Bottom,
multiplier: 1,
constant: 8)
icon.addConstraint(bottom)
var width = NSLayoutConstraint(
item: icon,
attribute: .Width,
relatedBy: .Equal,
toItem: nil,
attribute: .NotAnAttribute,
multiplier: 1,
constant: 20)
icon.addConstraint(width)
有人知道我做错了什么吗?
【问题讨论】:
在构造函数中定义约束或覆盖布局子视图。还要检查您是否将约束添加到父级。 setTranslatesAutoresizingMaskIntoConstraints 必须在 crated 视图上调用。此外,您必须将约束添加到超级视图而不是icon
。
【参考方案1】:
感谢 roronoa zorro 和 pe60t0,我发现我应该在相关视图上执行此操作,而不仅仅是 setTranslatesAutoresizingMaskIntoConstraints(false)
,所以:icon.setTranslatesAutoresizingMaskIntoConstraints(false)
。 在创建视图时也应该添加约束,所以我调用 override layoutSubviews()
并将它们添加到那里。
最后,我应该将约束添加到超级视图,而不是我“为其制作约束”的视图。所以我应该写:self.addConstraint(top)
,而不是icon.addConstraint(top)
。
【讨论】:
以上是关于视图层次结构没有为约束做好准备的主要内容,如果未能解决你的问题,请参考以下文章