【问题标题】:Update layout constraints programmatically without IBOutlets - Swift在没有 IBOutlets 的情况下以编程方式更新布局约束 - Swift
【发布时间】:2018-09-22 16:40:34
【问题描述】:

我正在尝试通过在点击“打开”按钮时更改左锚约束来制作滑出菜单。我见过人们在约束上使用 IBOutlets 来做这件事,但我正在使用的视图是完全以编程方式制作的,因此我无法这样做。

视图最初位于屏幕外,所以我想我可以在点击“打开”按钮时更改约束,但下面的代码什么也不做。

@objc func slideMenu() {
    sideMenu.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
    view.setNeedsUpdateConstraints()
}

有没有办法在没有 IBOutlet 的情况下更新左锚约束?

【问题讨论】:

    标签: ios swift autolayout hamburger-menu


    【解决方案1】:

    将约束存储在变量中并更改常量并在需要动画时调用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 查看答案中的第二行代码。您应该能够找出合适的位置。我也提供了适当的 cmets。
    • 对不起,我的误解。在用于设置初始约束的设置函数中,我将leftAnchor 约束设置为关闭屏幕,以便隐藏视图。我已经添加了代码行来设置constraintVariable,正如您的评论所说,并使用您提供的代码更改了@objc 函数,但是当点击按钮时没有任何反应。
    • @yambo 啊,我明白了。当你设置约束。将常量值设置为一些负值,就像你现在拥有的一样。除了将其设置为活动之外,将其存储在一个变量中并使用该变量将其设置为活动。
    • 谢谢!再次抱歉造成误解。这完美无缺
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2018-04-08
    • 1970-01-01
    • 2018-03-17
    相关资源
    最近更新 更多