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

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)

【讨论】:

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

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

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

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

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

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

“视图层次结构没有为约束做好准备”错误 Swift 3