以编程方式创建绑定到查看控制器边距的约束

时间:2016-04-08 18:45:24

标签: swift nslayoutconstraint

我正在尝试创建一个视图,它将作为一种“面板”,附加到视图控制器的右侧。

也就是说,它被绑定到父视图控制器的尾部,顶部和底部边距,静态宽度为300

但是,我似乎无法做到正确,我要么打破一个约束,要么做一些xcode告诉我是非法的。

我做错了什么?

这是控制器中的代码

data = modelindbA.objects.values_list('somecolumn',flat=True)
data = list(data)
info = C.objects.filter(somecolumn__in=data).values_list

2 个答案:

答案 0 :(得分:9)

在上面的示例代码中,您似乎在某些地方混淆了viewmyView。无论如何,widthConstraint应添加到myViewtopConstrainttrailingConstraintbottomConstraint应添加到self.view。其原因是必须将约束添加到最接近的superview祖先,该祖先放置约束中涉及的两个视图。如果要将子视图属性约束到其父视图上的属性,则必须将约束添加到父视图,因为它将自身和子视图都放在一起。如果两个兄弟视图之间存在约束,则约束将被添加到其父视图中,因为它是最接近所有视图的祖先。

如果您能够以iOS 9.0及更高版本为目标,那么使用新的NSLayoutAnchor和NSLayoutDimension API来创建这些类型的约束会更清晰,更容易。它还提供严格的类型检查,编译器可以验证是否正确。使用这些新API,您的示例代码将变为:

let myView = UIView()
myView.backgroundColor = UIColor.redColor()
self.view.addSubview(myView)

let margins = self.view.layoutMarginsGuide
myView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
myView.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true
myView.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true
myView.widthAnchor.constraintEqualToConstant(300.0).active = true

无需将约束显式添加到右视图等。您可以在此处阅读有关创建约束的此方法的更多信息:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/

在这里:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/

答案 1 :(得分:0)

你的代码中似乎存在一些歧义,你正在创建一个UIView作为myView,但是将视图添加到self.view甚至约束也可以查看自己。因此,请更正代码并使用myView替换视图。 其次setTranslayesAutoresizingMaskIntoConstraints为false。 然后将所有约束添加到self.view。这应该可以解决你的问题。

 myView.setTranslatesAutoresizingMaskIntoConstraints(false)
 self.view.addConstraints([trailingConstraint, bottomConstraint, widthConstraint])

VFL也是一种更好,更干净的方法。它实际上提供了如何设置约束的可视化。