使编程按钮等于故事板按钮的宽度

时间:2018-03-21 07:54:36

标签: swift

我想创建约束以使按钮(以编程方式制作)等于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))

1 个答案:

答案 0 :(得分:1)

  

我想创建一个约束来制作一个按钮(以编程方式制作)   等于stackview中的现有按钮。

你可以这样做。约束在2个视图或视图和常量(例如5)之间进行。在您的情况下,您应该在两个按钮之间进行约束。如果你的常量是另一个视图的属性(例如它的高度),那么你需要使用约束形式来获取2个视图并以这种方式访问​​属性。

约束中的是一个视图(UIView的子类,如UIButtonUILabel)。您的问题是当您真正需要@IBOutlet按钮本身时,按钮的高度为@IBOutlet

  

我认为最好在视图中显示,以便布局完成。

没有。如果您正在使用约束,则应在构建视图层次结构时提前设置约束(例如,在viewDidLoad中),以便在自动布局时>自动布局 em> run。

以下是您需要做的事情:

  1. signUpButton

    创建一个插座
    @IBOutlet weak var signUpButton: UIButton!
    
  2. 告诉您以编程方式创建的按钮,您不希望其框架变成约束:

    loginButton.translatesAutoresizingMaskIntoConstraints = false
    
  3. 创建并激活约束以使按钮的高度相等:

    loginButton.heightAnchor.constraint(equalTo: signupButton.heightAnchor).isActive = true
    

    这应该在将loginButton添加到视图层次结构(即添加到stackView)之后完成。

  4. 注意:

    1. 我使用布局锚来创建简洁明了的约束。你可以这样做:

      NSLayoutConstraint(item: loginButton, attribute: .height,
        relatedBy: .equal, toItem: signupButton,
        attribute: .height, multiplier: 1, constant: 0)
      
    2. 我使用.isActive = true来激活约束。这是激活约束的推荐方法。您可以将isActive属性设置为true自动布局将约束添加到正确的视图,而不是将它们添加到视图中。这是更好的,因为它经常混淆应该添加约束的视图。将此约束添加到其中一个按钮是不行的,因为它需要添加到它们的共同祖先(即stackView)。

      如果您想要一起激活多个约束,则可以将约束数组传递给activate的类函数NSLayoutConstraint

      例如:

      NSLayoutConstraint.activate([widthConstraint, heightConstraint])