我正在尝试创建一个视图,它将作为一种“面板”,附加到视图控制器的右侧。
也就是说,它被绑定到父视图控制器的尾部,顶部和底部边距,静态宽度为300
但是,我似乎无法做到正确,我要么打破一个约束,要么做一些xcode告诉我是非法的。
我做错了什么?
这是控制器中的代码
data = modelindbA.objects.values_list('somecolumn',flat=True)
data = list(data)
info = C.objects.filter(somecolumn__in=data).values_list
答案 0 :(得分:9)
在上面的示例代码中,您似乎在某些地方混淆了view
和myView
。无论如何,widthConstraint
应添加到myView
和topConstraint
,trailingConstraint
,bottomConstraint
应添加到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
无需将约束显式添加到右视图等。您可以在此处阅读有关创建约束的此方法的更多信息:
在这里:
答案 1 :(得分:0)
你的代码中似乎存在一些歧义,你正在创建一个UIView作为myView,但是将视图添加到self.view甚至约束也可以查看自己。因此,请更正代码并使用myView替换视图。 其次setTranslayesAutoresizingMaskIntoConstraints为false。 然后将所有约束添加到self.view。这应该可以解决你的问题。
myView.setTranslatesAutoresizingMaskIntoConstraints(false)
self.view.addConstraints([trailingConstraint, bottomConstraint, widthConstraint])
VFL也是一种更好,更干净的方法。它实际上提供了如何设置约束的可视化。