Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS自动布局约束问题|应用程序崩溃_Ios_Swift_Autolayout - Fatal编程技术网

iOS自动布局约束问题|应用程序崩溃

iOS自动布局约束问题|应用程序崩溃,ios,swift,autolayout,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!.f

我试图在运行时向屏幕的子视图添加约束。这导致了车祸。下面是我的代码:

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!)
    }
0..<5中变量i的
{
让aController=storyboard.InstanceEviewController(带有标识符:“设计”)
让itemView=aController.view
//itemView!.frame.origin.x=CGFloat(i)*itemView!.frame.width
itemView!.translatesAutoresizingMaskIntoConstraints=false
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:。尾部,相关者:。相等,toItem:itemView!,属性:。尾部,乘数:1,常数:20))
itemView!.addConstraint(NSLayoutConstraint(项目:滚动视图,属性:。前导,相关者:。相等,toItem:itemView!,属性:。前导,乘数:1,常数:0))
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:.top,相关者:.equal,toItem:itemView!,属性:.top,乘数:1,常数:20))
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:.bottom,relatedBy:.equal,toItem:itemView!,属性:.bottom,乘数:1,常数:20))
scrollView.addSubview(itemView!)
}
我得到的错误如下所示:

2017-10-23 10:39:37.087674+0530过山车潜力[998:22689] [LayoutConstraints]视图层次结构未为 约束条件:

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

2017-10-23 10:39:37.087924+0530过山车潜力[998:22689]* -[UIView]中的断言失败 _layoutEngine\u添加LayoutConstraint: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过山车潜力[998:22689]* 由于未捕获异常而终止应用程序 “NSInternalinconsistenceException”,原因:“无法设置 视图层次结构未为约束做好准备的布局。'

试试这个:

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))
        }

    }
}
func addConstraints(){
var itemViews:[UIView]=[]
对于0..<5中的i{
让aController=storyboard!。实例化EviewController(带有标识符:“设计”)
让itemView=aController.view
itemView!.translatesAutoresizingMaskIntoConstraints=false
scrollView.addSubview(itemView!)
附加(itemView!)
scrollView.addConstraint(NSLayoutConstraint(项:项视图!,属性:。尾部,相关者:。相等,toItem:scrollView,属性:。尾部,乘数:1,常数:20))
scrollView.addConstraint(NSLayoutConstraint(项:项视图!,属性:。前导,相关者:。相等,toItem:scrollView,属性:。前导,乘数:1,常数:0))
如果(i==0){
scrollView.addConstraint(NSLayoutConstraint(项:项视图!,属性:.top,相关者:.equal,toItem:scrollView,属性:.top,乘数:1,常数:20))
}否则{
让previousView=ItemView[i-1]
itemView!.addConstraint(NSLayoutConstraint(项:previousView!,属性:.top,关系人:.equal,toItem:itemView!,属性:.top,乘数:1,常数:20))
}
如果i==4{
scrollView.addConstraint(NSLayoutConstraint(项:项视图!,属性:。底部,相关者:。相等,toItem:scrollView,属性:。底部,乘数:1,常数:20))
}
}
}

在scrollview中添加项之前,您正在添加约束。导致以下错误

“无法设置视图层次结构不受约束的布局。”

相反,在scrollview中添加项,然后应用约束。可能是这样的。(假设其余约束条件良好。)

0..<5中变量i的
{
让aController=storyboard.InstanceEviewController(带有标识符:“设计”)
让itemView=aController.view
//itemView!.frame.origin.x=CGFloat(i)*itemView!.frame.width
itemView!.translatesAutoresizingMaskIntoConstraints=false
//在下面添加您的视图
scrollView.addSubview(itemView!)
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:。尾部,相关者:。相等,toItem:itemView!,属性:。尾部,乘数:1,常数:20))
itemView!.addConstraint(NSLayoutConstraint(项目:滚动视图,属性:。前导,相关者:。相等,toItem:itemView!,属性:。前导,乘数:1,常数:0))
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:.top,相关者:.equal,toItem:itemView!,属性:.top,乘数:1,常数:20))
itemView!.addConstraint(NSLayoutConstraint(项:scrollView,属性:.bottom,relatedBy:.equal,toItem:itemView!,属性:.bottom,乘数:1,常数:20))
}

如何在ViewController中定义和添加scrollView?scrollView是通过Interface Builder添加的(不是动态添加的)。首先,我认为您不需要为scrollView将TranslatesAutoResizezingMaskinToConstraints设置为false。您应该为每个itemView将其设置为false。其次,如果您使用的是Autolayout,则不需要设置itemview框架的原点。第三,您应该为itemview创建自动布局约束(以满足位置和大小,而不仅仅是尾部约束),并将其添加到scrollview。不要用其他方法。请查看更新的代码@PuneetSharma。我仍然收到相同的错误。包含一个ASWER所有视图都在一起。相互重叠。它正在破坏应用程序。第一个元素应该有固定的顶部、底部、前导和尾随空间,但后续的itemView应该只有水平空间。顶部和底部应固定。不是吗?@TechBee:第一项应该是
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))

}