繁体   English   中英

如何以编程方式修改UIButton的约束

[英]How to modify programmatically constraints of UIButton

我有2个具有不同约束条件的按钮写在情节提要中。 在我的代码中,我必须告诉我的第一个按钮采取与第二个按钮相同的约束(高度,宽度和位置 ),但是我不知道如何在不必通过“ subview”的情况下做到这一点。 我的按钮有2个插座。

@IBOutlet weak var likesButton: UIButton!    
@IBOutlet weak var shareButton: UIButton!

我的界面是这样构建的:

--

VIEW
     a)...View
     b)...View
     c) ContentView
         1)likeButton
         2)shareButton
         3)...
     d)...

我这样尝试过:

      self.contentView.translatesAutoresizingMaskIntoConstraints = false
        self.shareButton.removeConstraints(self.shareButton.constraints) // Old Constraints
        self.shareButton.addConstraints(self.likeButton.constraints) // New Constraints
        self.shareButton.updateConstraintsIfNeeded()
        self.shareButton.layoutIfNeeded()

在出现此错误之后:

 *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view.  Does the constraint reference something from outside the subtree of the view?  That's illegal. constraint:<NSLayoutConstraint:0x14cfe7600 H:[UIButton:0x14cfb7bd0(40)]> view:<UIButton: 0x14e30fa60; frame = (494 528; 26 31); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x14e30f410>>'

提前谢谢。

约束是否引用了视图子树之外的内容?

好像在说...

likeButton的约束是否从shareButton的子树之外引用某些内容?

因此,likeButton约束引用(如likeButton本身)完全在shareButtons视图层次结构之外。 无法以这种方式添加它们。

您可以改为:

self.view.removeConstraints(self.shareButton.constraints)
self.view.addConstraints(self.likeButton.constraints)

但这无法完成您想要做的任何事情。

约束不仅仅是数量和维度。 它还定义了要约束的两个对象。 因此,尝试将一个视图约束映射到另一个视图约束是行不通的,因为它不会更改约束中引用的视图。

您可能可以找到一种方法来实现此目的,方法是使用各种约束的出口,并将约束常数从一个视图中拉出,然后将其分配给另一个视图。

如果这是您的情况:

  • 您的按钮约束已在IB中设置,您希望在代码中一一 更改或替换约束。

然后,您可以为每个约束设置一个IBOutlet,并按名称进行编辑(更改,替换甚至停用它们)。

@IBOutlet weak var likesConstraintLeading: NSLayoutConstraint!
@IBOutlet weak var likesConstraintTop: NSLayoutConstraint!
@IBOutlet weak var likesConstraintWidth: NSLayoutConstraint!

likesConstraintLeading.isActive = false
likesConstraintTop.constant = 20
likesConstraintWidth.multiplier = 3.5
  • 您的按钮约束已在IB中设置,并且您希望替换为单个IBOutlet命名的按钮设置的全部约束。

您可以将代码中的新约束集设置为数组,并在删除旧约束后将其激活。

@IBOutlet weak var likesConstraintTop: NSLayoutConstraint!
@IBOutlet weak var likesConstraintLeading: NSLayoutConstraint!
@IBOutlet weak var likesConstraintWidth: NSLayoutConstraint!

var newConstraints = [NSLayoutConstraint]()

newConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor))
newConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 20))
newConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 100))

likesConstraintLeading.isActive = false
likesConstraintTop.isActive = false
likesConstraintWidth.isActive = false
NSLayoutConstraint.activate([newConstraints])

请注意-您仍然需要一一停用这些功能,因为这些约束(宽度除外)已添加到控件的超级视图中,并且其中可能还有更多约束!

  • 您已经在IB中设置了按钮,但是您希望通过代码维护一组约束。

此IMHO是您可以做的最好的设置,因为您仍然可以通过IB添加所有其他约束,并将代码限制为要更改的内容。

var startingConstraints = [NSLayoutConstraint]()
var endingConstraints = [NSLayoutConstraint]()

override func viewDidLoad() {
    startingConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor))
    startingConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 20))
    startingConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 100))
    endingConstraints.append(likesButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30))
    endingConstraints.append(likesButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 40))
    endingConstraints.append(likesButton.widthAnchor.constraint(equalToConstant: 80))
    NSLayoutConstraint.activate([startingConstraints])
}

func changeConstraints() {
    NSLayoutConstraint.deactivate([newConstraints])
    NSLayoutConstraint.activate([newConstraints])
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM