Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 以编程方式创建绑定到视图控制器页边距的约束_Swift_Nslayoutconstraint - Fatal编程技术网

Swift 以编程方式创建绑定到视图控制器页边距的约束

Swift 以编程方式创建绑定到视图控制器页边距的约束,swift,nslayoutconstraint,Swift,Nslayoutconstraint,我正在尝试创建一个视图,它将充当一种“面板”,连接到视图控制器的右侧 也就是说,它绑定到父视图控制器的尾部、顶部和底部边距,静态宽度为300 然而,我似乎不能正确地理解它,我要么打破了限制,要么做了xcode告诉我是非法的事情 我做错了什么 这是控制器中的代码 let myView = UIView() view.backgroundColor = UIColor.redColor() self.view.addSubview(view) let topConst

我正在尝试创建一个视图,它将充当一种“面板”,连接到视图控制器的右侧

也就是说,它绑定到父视图控制器的尾部、顶部和底部边距,静态宽度为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])

代码中似乎有一些模糊之处,您正在创建一个UIView作为myView,但在self.view中添加了视图,甚至在视图本身中添加了约束。因此,请更正代码并用myView替换view。 其次,将TranslayesAutoresizengMaskinToConstraints设置为false。 然后将所有约束添加到self.view。这应该能解决你的问题

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

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

在上面的示例代码中,您似乎在一些地方混淆了
view
myView
。在任何情况下,
widthConstraint
都应添加到
myView
topConstraint
trailingConstraint
,以及
bottomConstraint
应添加到
self.view
。原因是必须将约束添加到最接近的superview上级,该上级将布置约束中涉及的两个视图。如果要将子视图属性约束到其父视图上的属性,则必须将约束添加到父视图中,因为它同时布置了自身和子视图。如果两个同级视图之间存在约束,则该约束将添加到它们的父视图中,因为它是最接近的父视图,用于布置所涉及的两个视图

如果您能够以iOS 9.0及以上版本为目标,那么使用新的NSLAYOUTACHOR和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
无需将约束显式添加到右侧视图等。您可以在此处阅读有关此创建约束方法的更多信息:

在这里:


实际上,代码中的问题是,您没有将
myview
TranslatesAutoReshizingMacintoConstraints
设置为
false
,每当您想要使用自动布局约束时,您必须将视图的
TranslatesAutoReshizingMacintoConstraints
设置为false。 另一个问题是,您没有在self.view上添加
myview
。我已经更新了您的代码,并且根据您的约束条件,它可以正常工作

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

为什么不使用可视化格式语言来实现这个呢<代码>“H:[panel(300)]|和
“V:|[toplayout][panel][botlayout]|”
应该就足够了。如果您想要更简单的方式以编程方式添加约束,那么您可以使用。