Ios 在代码中设置IBOutlet的自动布局约束
如果我有一个UILabel是一个IBOutlet,为什么我不能在代码中设置它的自动布局约束,而不必在情节提要中设置至少一个约束 例如,假设我有一个在情节提要中没有设置约束的IBUILabel,我尝试在superview中将其居中:Ios 在代码中设置IBOutlet的自动布局约束,ios,swift,autolayout,Ios,Swift,Autolayout,如果我有一个UILabel是一个IBOutlet,为什么我不能在代码中设置它的自动布局约束,而不必在情节提要中设置至少一个约束 例如,假设我有一个在情节提要中没有设置约束的IBUILabel,我尝试在superview中将其居中: override func viewDidLoad() { super.viewDidLoad() self.label.setTranslatesAutoresizingMaskIntoConstraints(false) self.labe
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中,那么添加您自己的约束,并在编辑约束时选中“在构建时删除”框。