UIButton约束以编程方式

时间:2019-02-15 14:51:16

标签: ios objective-c

我已经使用情节提要创建了“第一个按钮”并为其设置了约束,现在我要以编程方式创建另一个按钮并将其设置在第一个按钮上方,例如:image of buttons

,我使用以下代码尝试实现这一目标:

  NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0];


    NSLayoutConstraint *Yxonstraints = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.invoiceTextField attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];

    NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200];

    NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:200];

    [self.view addConstraints:@[xConstraint,Yxonstraints,width,height]];

第二个按钮结束于中间和左侧,并且也小于其实际大小,这是我在做什么错?

3 个答案:

答案 0 :(得分:0)

 NSLayoutConstraint *Yxonstraints = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.invoiceTextField attribute:NSLayoutAttributeTop multiplier:1.0 constant:0];

您不想要那样。您希望secondButton.top是firstButton.bottom的空间:

 NSLayoutConstraint *Yxonstraints = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.invoiceTextField attribute:NSLayoutAttributeBottom multiplier:1.0 constant:20];

答案 1 :(得分:0)

您需要

self.secondBu.translatesAutoresizingMaskIntoConstraints = false 
NSLayoutConstraint.activate([ 
    self.secondBu.bottomAnchor.constraint(equalTo: self.firstBu.topAnchor, constant:-15)  
    self.secondBu.leadingAnchor.constraint(equalTo: self.firstBu.leadingAnchor), 
    self.secondBu.trailingAnchor.constraint(equalTo: self.firstBu.trailingAnchor),
    self.secondBu.heightAnchor.constraint(equalTo: self.firstBu.heightAnchor)
])     

但最简单的方法是将firstBu插入情节提要中的UIStackView内,然后使用1行

self.stackView.insertArrangedSubview(secondBu,at:0)

您也可以在IB中将stackView interval属性设置为15,也应避免按照Apple的建议使用addConstraints并使用NSLayoutConstraint.activate

答案 2 :(得分:-2)

您可以通过以下步骤实现相同目的:

  • 在情节提要中的视图上添加具有前导,尾随,底部的新按钮 和高度限制。
  • 为高度限制附加了IBOutlet,并将其设置为0。
  • 将以下行添加到要添加 按钮。

    self.buttonHeightConstant.constant = 50 self.view.layoutIfNeeded()

它将为高度约束设置新值以使其可见,第二行更新视图的其他约束。