我试图在运行时向屏幕的子视图添加约束。这导致崩溃。以下是我的代码:
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',原因:'无法设置 视图层次结构的布局没有为约束做好准备。'
答案 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))
}