【问题标题】:How to modify programmatically constraints of UIButton如何以编程方式修改 UIButton 的约束
【发布时间】:2016-11-17 16:55:58
【问题描述】:

我在情节提要中有 2 个具有不同约束的按钮。 在我的代码中,我必须告诉我的第一个按钮采用与第二个按钮相同的约束(高度、宽度、和位置)但我不知道如何做到这一点而不必通过“子视图”。我的按钮有 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>>'

提前致谢。

【问题讨论】:

  • 约束被添加到超级视图中,该视图包含您尝试添加约束的视图,而不是视图本身。
  • 好的,但是我说将约束添加到 shareButton 而不是视图?

标签: ios swift uibutton constraints constraint-programming


【解决方案1】:

约束是否引用了视图子树之外的东西?

这好像是说……

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

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

你可以这样做:

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

但这不会完成你想要做的任何事情。

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

您可能会想出一种方法来使用各种约束的出口并将约束常量从一个视图中拉出并将它们分配给另一个视图。

【讨论】:

  • 感谢您给了我使用网点约束破解方法的想法!这帮助很大!
【解决方案2】:

如果这是你的场景:

  • 您的按钮约束已在 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 中设置了按钮,但您希望通过代码维护一组约束。

恕我直言,此设置是您可以做的最佳设置,因为您可以仍然通过 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])
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多