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

Posted

技术标签:

【中文标题】在扩展中出现错误“视图层次结构没有为约束做好准备”【英文标题】:Getting the error in an extension 'The view hierarchy is not prepared for the constraint' 【发布时间】:2019-10-04 13:31:57 【问题描述】:

我在 thumbnailImageView 之上添加 thumbnailMaskView 并且它有效!

func setupViews() 

    addSubview(thumbnailImageView)
    addSubview(thumbnailMaskView)

    addConstraintsWithFormat(format: "H:|[v0]|", views: thumbnailImageView)
    addConstraintsWithFormat(format: "V:|-16-[v0]-16-|", views: thumbnailImageView)

    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .leading, relatedBy: .equal, toItem: thumbnailImageView, attribute: .leading, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .trailing, relatedBy: .equal, toItem: thumbnailImageView, attribute: .trailing, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .top, relatedBy: .equal, toItem: thumbnailImageView, attribute: .top, multiplier: 1, constant: 0)])
    addConstraints([NSLayoutConstraint(item: thumbnailMaskView, attribute: .bottom, relatedBy: .equal, toItem: thumbnailImageView, attribute: .bottom, multiplier: 1, constant: 0)])

我正在尝试使用以下代码将该代码提取到 UIView Extension

extension UIView 

    func addOnTop(_ topView: UIView) 
        addConstraints([NSLayoutConstraint(item: topView, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 0)])
        addConstraints([NSLayoutConstraint(item: topView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1, constant: 0)])
    

使用extension 函数thumbnailImageView.addOnTop(thumbnailMaskView) 时出现错误:

2019-10-04 14:19:13.149081+0100 有钱人[1589:18861] [LayoutConstraints] 视图层次结构没有为 约束: (inactive)> 当添加到视图时,约束的项目必须是 该视图(或视图本身)的后代。如果 在视图层次结构之前需要解决约束 组装。打破 -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] 进行调试。 2019-10-04 14:19:13.152718+0100 富人[1589:18861] [LayoutConstraints] 查看 没有为约束做好准备的层次结构。约束: 容器层次结构: > 查看 在容器层次结构中找不到:> 该视图的 superview: > 2019-10-04 14:19:13.160046+0100 丰富 People[1589:18861] *** 由于未捕获的异常而终止应用程序 'NSGenericException',原因:'无法在视图上安装约束。 约束是否引用了子树外部的某些内容 风景?那是违法的。 约束: (活动)> 视图:>'

【问题讨论】:

你如何使用addOnTop ?? 【参考方案1】:

要向视图添加约束,那么这些约束应该用于子/后代视图,因此最好使用activate

NSLayoutConstraint.activate([  
    topView.leadingAnchor.constraint(equalTo: self.leadingAnchor), 
    topView.trailingAnchor.constraint(equalTo: self.trailingAnchor), 
    topView.topAnchor.constraint(equalTo: self.topAnchor), 
    topView.bottomAnchor.constraint(equalTo: self.bottomAnchor) 
])

它会将约束添加到正确的视图中

【讨论】:

我已经将它们添加到 addSubview(thumbnailImageView) addSubview(thumbnailMaskView) 中的视图中,这些行将占据所有视图 是的,但是 thumbnailImageView.addOnTop(thumbnailMaskView) 将两个视图之间的约束添加到 thumbnailImageView 这是不正确的,因为它们应该添加到 thumbnailImageView 的父视图中尝试 thumbnailImageView.superView!.addOnTop 并且它应该可以工作

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

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

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

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

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

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

为 UITableCellView 中的视图添加 NSLayoutConstraint