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