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

pra*_*awn 16 nslayoutconstraint swift

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

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

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

我究竟做错了什么?

这是控制器中的代码

    let myView = UIView()
    view.backgroundColor = UIColor.redColor()
    self.view.addSubview(view)
    let topConstraint = NSLayoutConstraint(item: myView,
                                           attribute: .Top,
                                           relatedBy: .Equal,
                                           toItem: self.topLayoutGuide,
                                           attribute: .Bottom,
                                           multiplier: 1,
                                           constant: 0)

    let trailingConstraint = NSLayoutConstraint(item: self.view,
                                                attribute: .TrailingMargin,
                                                relatedBy: .Equal,
                                                toItem: myView,
                                                attribute: .Trailing,
                                                multiplier: 1,
                                                constant: 0)

    let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide,
                                              attribute: .Top,
                                              relatedBy: .Equal,
                                              toItem: myView,
                                              attribute: .Bottom,
                                              multiplier: 1,
                                              constant: 0)

    let widthConstraint = NSLayoutConstraint(item: myView,
                                             attribute: .Width,
                                             relatedBy: .Equal,
                                             toItem: nil,
                                             attribute: .NotAnAttribute,
                                             multiplier: 1,
                                             constant: 300)

    self.view.addConstraints([trailingConstraint])
    view.addConstraints([topConstraint, bottomConstraint, widthConstraint])
Run Code Online (Sandbox Code Playgroud)

kes*_*rma 52

其实在你的代码的问题是,你没有设置translatesAutoresizingMaskIntoConstraintsmyviewfalse,只要你想使用自动布局限制,那么你必须设置translatesAutoresizingMaskIntoConstraints一个以虚假的.另一个问题是你没有添加myviewself.view我已经更新了你的代码,它的工作正常根据你的约束.

将以下代码放在ViewController中.

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

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0))
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Bottom, relatedBy: .Equal, toItem: self.bottomLayoutGuide, attribute:.Top, multiplier: 1, constant: 20))

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute,multiplier: 1, constant: 300))
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .TrailingMargin, relatedBy: .Equal, toItem: view, attribute: .TrailingMargin, multiplier: 1, constant: 0))
Run Code Online (Sandbox Code Playgroud)


Dan*_*all 9

在上面的示例代码中,您似乎在混合viewmyView在几个地方.在任何情况下,widthConstraint应加myViewtopConstraint,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
Run Code Online (Sandbox Code Playgroud)

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

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

和这里:

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