在代码中设置IBOutlet的自动布局约束

时间:2015-03-29 23:39:34

标签: ios swift autolayout

如果我有一个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),那么它也可以工作。

1 个答案:

答案 0 :(得分:4)

如果故事板或NIB启用了自动布局,Xcode将不允许视图缺少约束。选择视图并调出“大小”检查器。您将看到一个注释,即“所选视图没有约束。在构建时,将为视图生成显式左,顶,宽和高度约束。”

通常,Xcode将提供约束以消除布局中的歧义。

您可以通过向视图添加足够的约束但将其标记为占位符(在构建时删除)来解决此问题。这将使视图没有约束。

您还可以添加约束,为约束设置出口,并在添加其他约束之前以编程方式删除它们。