iOS Autolayout约束问题|应用崩溃

时间:2017-10-23 05:18:38

标签: ios swift autolayout

我试图在运行时向屏幕的子视图添加约束。这导致崩溃。以下是我的代码:

for var i in 0 ..< 5{
        let aController = storyboard.instantiateViewController(withIdentifier: "design")
        let itemView = aController.view
        //itemView!.frame.origin.x = CGFloat(i) * itemView!.frame.width
        itemView!.translatesAutoresizingMaskIntoConstraints = false

        itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .trailing, relatedBy: .equal, toItem: itemView!, attribute: .trailing, multiplier: 1, constant: 20))
        itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .leading, relatedBy: .equal, toItem: itemView!, attribute: .leading, multiplier: 1, constant: 0))
        itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .top, relatedBy: .equal, toItem: itemView!, attribute: .top, multiplier: 1, constant: 20))
        itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .bottom, relatedBy: .equal, toItem: itemView!, attribute: .bottom, multiplier: 1, constant: 20))

        scrollView.addSubview(itemView!)
    }

我得到的错误如下:

  

2017-10-23 10:39:37.087674 + 0530 RollerCoasterPotential [998:22689]   [LayoutConstraints]视图层次结构未准备好   约束:

     

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

     

2017-10-23 10:39:37.087924 + 0530 RollerCoasterPotential [998:22689] *   断言失败 - [UIView   _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:],   /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3688.4/NSLayoutConstraint_UIKitAdditions.m:734   2017-10-23 10:39:37.177966 + 0530 RollerCoasterPotential [998:22689] *   由于未捕获的异常而终止应用程序   'NSInternalInconsistencyException',原因:'无法设置   视图层次结构的布局没有为约束做好准备。'

2 个答案:

答案 0 :(得分:1)

试试这个:

func addConstraints() {
    var itemViews:[UIView] = []
    for i in 0 ..< 5 {
        let aController = storyboard!.instantiateViewController(withIdentifier: "design")
        let itemView = aController.view
        itemView!.translatesAutoresizingMaskIntoConstraints = false
        scrollView.addSubview(itemView!)
        itemViews.append(itemView!)
        scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .trailing, relatedBy: .equal, toItem: scrollView, attribute: .trailing, multiplier: 1, constant: 20))
        scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .leading, relatedBy: .equal, toItem: scrollView, attribute: .leading, multiplier: 1, constant: 0))

        if(i == 0) {
            scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .top, relatedBy: .equal, toItem: scrollView, attribute: .top, multiplier: 1, constant: 20))
        } else {
            let previousView = itemViews[i-1]
            itemView!.addConstraint(NSLayoutConstraint(item: previousView!, attribute: .top, relatedBy: .equal, toItem:itemView!, attribute: .top, multiplier: 1, constant: 20))
        }

        if i == 4 {
            scrollView.addConstraint(NSLayoutConstraint(item: itemView!, attribute: .bottom, relatedBy: .equal, toItem: scrollView, attribute: .bottom, multiplier: 1, constant: 20))
        }

    }
}

答案 1 :(得分:0)

您在滚动视图中添加项目之前添加了约束。导致以下错误,

&#39;无法设置视图层次结构的布局,无法用于约束。&#39;

相反,在scrollview中添加项目,然后应用约束。可能是这样的。 (假设你的其他约束都很好。)

for var i in 0 ..< 5{
    let aController = storyboard.instantiateViewController(withIdentifier: "design")
    let itemView = aController.view

    //itemView!.frame.origin.x = CGFloat(i) * itemView!.frame.width
    itemView!.translatesAutoresizingMaskIntoConstraints = false

    //Below add your view

    scrollView.addSubview(itemView!)

    itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .trailing, relatedBy: .equal, toItem: itemView!, attribute: .trailing, multiplier: 1, constant: 20))
    itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .leading, relatedBy: .equal, toItem: itemView!, attribute: .leading, multiplier: 1, constant: 0))
    itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .top, relatedBy: .equal, toItem: itemView!, attribute: .top, multiplier: 1, constant: 20))
    itemView!.addConstraint(NSLayoutConstraint(item: scrollView, attribute: .bottom, relatedBy: .equal, toItem: itemView!, attribute: .bottom, multiplier: 1, constant: 20))

}