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

Ios 在代码中设置IBOutlet的自动布局约束,ios,swift,autolayout,Ios,Swift,Autolayout,如果我有一个UILabel是一个IBOutlet,为什么我不能在代码中设置它的自动布局约束,而不必在情节提要中设置至少一个约束 例如,假设我有一个在情节提要中没有设置约束的IBUILabel,我尝试在superview中将其居中: override func viewDidLoad() { super.viewDidLoad() self.label.setTranslatesAutoresizingMaskIntoConstraints(false) self.labe

如果我有一个UILabel是一个IBOutlet,为什么我不能在代码中设置它的自动布局约束,而不必在情节提要中设置至少一个约束

例如,假设我有一个在情节提要中没有设置约束的IBUILabel,我尝试在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),那么它也可以工作。

如果情节提要或NIB启用了自动布局,Xcode将不允许视图缺少约束。选择视图并打开尺寸检查器。您将看到一个注释,大意是“所选视图没有约束。在构建时,将为视图生成显式的左、顶、宽和高约束。”

通常,Xcode将提供约束以消除布局中的模糊性

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


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

是否在您放置在情节提要上的UI元素上调用
setTranslatesAutoResizezingMaskintoConstraints(false)
?或者只是调用你的
centerInSuperview()
?@nhgrif我已经尝试过使用和不使用setTranslates调用。两者都不起作用。这是因为如果您不这样做,系统会为您添加约束,而这些约束将与您的约束冲突。查看“大小检查器”中“约束”下的内容,查看尚未添加约束的视图。@rdelmar这是否意味着在代码中设置约束之前需要删除所有约束?当我在Size Inspector中查找我没有添加约束的标签时,它会说“所选视图没有约束。在构建时,将为视图生成显式的左、顶、宽和高约束。”首先,我想说,如果不添加约束,为什么还要在IB中添加视图;只需在代码中创建它。如果您真的想将其添加到IB中,那么添加您自己的约束,并在编辑约束时选中“在构建时删除”框。