我想创建约束以使按钮(以编程方式制作)等于stackview中的现有按钮。
我认为最好在视图中显示,以便布局完成。
不幸的是,以下结果导致崩溃 - NSInvalidArgumentException未知布局属性。
我的注册按钮高度有一个故事板约束 -
@IBOutlet weak var signupHeight: NSLayoutConstraint!
然后会出现在视图中:
loginStack.insertArrangedSubview(loginButton, at: 0)
loginButton.addConstraint(NSLayoutConstraint(item: loginButton, attribute: .height, relatedBy: .equal, toItem: signupHeight, attribute: .notAnAttribute, multiplier: 1, constant: 0))
答案 0 :(得分:1)
我想创建一个约束来制作一个按钮(以编程方式制作) 等于stackview中的现有按钮。
你可以这样做。约束在2个视图或视图和常量(例如5
)之间进行。在您的情况下,您应该在两个按钮之间进行约束。如果你的常量是另一个视图的属性(例如它的高度),那么你需要使用约束形式来获取2个视图并以这种方式访问属性。
约束中的项是一个视图(UIView
的子类,如UIButton
或UILabel
)。您的问题是当您真正需要@IBOutlet
按钮本身时,按钮的高度为@IBOutlet
。
我认为最好在视图中显示,以便布局完成。
没有。如果您正在使用约束,则应在构建视图层次结构时提前设置约束(例如,在viewDidLoad
中),以便在自动布局时>>自动布局> em> run。
以下是您需要做的事情:
为signUpButton
:
@IBOutlet weak var signUpButton: UIButton!
告诉您以编程方式创建的按钮,您不希望其框架变成约束:
loginButton.translatesAutoresizingMaskIntoConstraints = false
创建并激活约束以使按钮的高度相等:
loginButton.heightAnchor.constraint(equalTo: signupButton.heightAnchor).isActive = true
这应该在将loginButton
添加到视图层次结构(即添加到stackView)之后完成。
注意:
我使用布局锚来创建简洁明了的约束。你可以这样做:
NSLayoutConstraint(item: loginButton, attribute: .height,
relatedBy: .equal, toItem: signupButton,
attribute: .height, multiplier: 1, constant: 0)
我使用.isActive = true
来激活约束。这是激活约束的推荐方法。您可以将isActive
属性设置为true
而自动布局将约束添加到正确的视图,而不是将它们添加到视图中。这是更好的,因为它经常混淆应该添加约束的视图。将此约束添加到其中一个按钮是不行的,因为它需要添加到它们的共同祖先(即stackView)。
如果您想要一起激活多个约束,则可以将约束数组传递给activate
的类函数NSLayoutConstraint
:
例如:
NSLayoutConstraint.activate([widthConstraint, heightConstraint])