在Swift中以编程方式更新布局约束,无需使用IBOutlets

7
我试图通过在“打开”按钮被点击时更改左锚定约束来制作滑动菜单。我看到有人使用IBOutlets在约束上做到了这一点,但我正在使用完全基于编程的视图,使我无法这样做。
视图最初位于屏幕之外,因此我认为我只需在点击“打开”按钮时更改约束即可,但是下面的代码没有任何效果。
@objc func slideMenu() {
    sideMenu.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    view.setNeedsUpdateConstraints()
}

有没有一种方法可以在没有IBOutlet的情况下更新左侧锚定约束?
1个回答

15

将限制条件存储在一个变量中,更改常量并在需要进行动画处理时调用layoutIfNeeded

// Declare this along with the other variables in your class
var constraintVariable: NSLayoutConstraint!

.
.
.

// Where you set your constraints. Store the constraint to be animated in the variable and make it active
// Your other constraints
constraintVariable = sideMenu.leftAnchor.constraint(equalTo: view.leftAnchor, constant: someNegativeValue);
constraintVariable.isActive = true

.
.
.

@objc func slideMenu() {
    UIView.animate(withDuration: suitableDuration) {
        constraintVariable.constant = requiredValue
        view.setNeedsLayout()
        view.layoutIfNeeded()
    }
}

那我是使用 constraintVariable 来设置视图的初始约束吗?即保持视图不在屏幕上的初始约束? - yambo
@yambo,请查看答案中的第二行代码。你应该能够弄清楚它在哪里适用。我也提供了适当的注释。 - Rakesha Shastri
抱歉我的误解。在设置函数中,我为设置初始约束而将“leftAnchor”约束设置为屏幕外,以便隐藏视图。我已添加了一行代码来设置“constraintVariable”,就像您的评论所说的那样,并使用您提供的代码更改了@objc函数,但是当点击按钮时没有任何反应。 - yambo
@yambo 啊,我明白了。当你设置约束时,将常量值设置为一些负值,就像你现在所做的那样。不过,不要将其设置为活动状态,而是将其存储在一个变量中,并使用该变量将其设置为活动状态。 - Rakesha Shastri
谢谢!再次抱歉造成误解。这个完美地运作了。 - yambo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接