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
其实在你的代码的问题是,你没有设置translatesAutoresizingMaskIntoConstraints
的myview
到false
,只要你想使用自动布局限制,那么你必须设置translatesAutoresizingMaskIntoConstraints
一个以虚假的.另一个问题是你没有添加myview
self.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)
在上面的示例代码中,您似乎在混合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
Run Code Online (Sandbox Code Playgroud)
无需将约束显式添加到右视图等.您可以在此处阅读有关创建约束的此方法的更多信息:
和这里:
归档时间: |
|
查看次数: |
47361 次 |
最近记录: |