[英]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)
但这无法完成您想要做的任何事情。
约束不仅仅是数量和维度。 它还定义了要约束的两个对象。 因此,尝试将一个视图约束映射到另一个视图约束是行不通的,因为它不会更改约束中引用的视图。
您可能可以找到一种方法来实现此目的,方法是使用各种约束的出口,并将约束常数从一个视图中拉出,然后将其分配给另一个视图。
如果这是您的情况:
然后,您可以为每个约束设置一个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
您可以将代码中的新约束集设置为数组,并在删除旧约束后将其激活。
@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])
请注意-您仍然需要一一停用这些功能,因为这些约束(宽度除外)已添加到控件的超级视图中,并且其中可能还有更多约束!
此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.