如果我有一个IBOutlet的UILabel,为什么我不能在代码中设置其自动布局约束而不必在Storyboard中设置至少一个约束?
例如,假设我有一个没有在故事板中设置约束的IBOutlet UILabel,我尝试将其置于superview中:
override func viewDidLoad() {
super.viewDidLoad()
self.label.setTranslatesAutoresizingMaskIntoConstraints(false)
self.label.centerInSuperview()
}
然后我有一个UIView扩展来处理自动布局代码,如下所示:
extension UIView {
func centerInSuperview() {
self.centerVerticallyInSuperview()
self.centerHorizontallyInSuperview()
}
func centerVerticallyInSuperview() {
self.superview?.addConstraint(NSLayoutConstraint(
item: self,
attribute: NSLayoutAttribute.CenterY,
relatedBy: NSLayoutRelation.Equal,
toItem: self.superview,
attribute: NSLayoutAttribute.CenterY,
multiplier: 1,
constant: 0))
}
func centerHorizontallyInSuperview() {
self.superview?.addConstraint(NSLayoutConstraint(
item: self,
attribute: NSLayoutAttribute.CenterX,
relatedBy: NSLayoutRelation.Equal,
toItem: self.superview,
attribute: NSLayoutAttribute.CenterX,
multiplier: 1,
constant: 0))
}
}
如果UILabel是从代码创建的,上面的代码可以正常工作:
var label = UILabel()
label.text = "Label"
self.view.addSubview(label)
label.setTranslatesAutoresizingMaskIntoConstraints(false)
label.centerInSuperview()
但是如果UILabel是一个没有在故事板中设置约束的插座那么它就不起作用了。奇怪的是,如果插座在故事板中设置了一个随机约束(如顶层空间到superview),那么它也可以工作。
答案 0 :(得分:4)
如果故事板或NIB启用了自动布局,Xcode将不允许视图缺少约束。选择视图并调出“大小”检查器。您将看到一个注释,即“所选视图没有约束。在构建时,将为视图生成显式左,顶,宽和高度约束。”
通常,Xcode将提供约束以消除布局中的歧义。
您可以通过向视图添加足够的约束但将其标记为占位符(在构建时删除)来解决此问题。这将使视图没有约束。
您还可以添加约束,为约束设置出口,并在添加其他约束之前以编程方式删除它们。