停用在viewdidload中使用功能声明的nslayoutconstraint

问题描述 投票:0回答:2

下面的代码在viewdidload中声明布局约束。调用函数Selena时,我希望将约束更改为函数selena中的约束。当我调用该函数时,对象不会改变。没有作用。我知道我必须停用原来的约束。

   override func viewDidLoad() {

    NSLayoutConstraint.activate ([
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -200),

        i.widthAnchor.constraint(equalToConstant: 300),
        i.heightAnchor.constraint(equalToConstant: 450),

    ])

}


@objc func selena(){
    NSLayoutConstraint.activate ([
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :50),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -50),

        i.widthAnchor.constraint(equalToConstant: 20),
        i.heightAnchor.constraint(equalToConstant: 450),

    ])

}
swift function nslayoutconstraint viewdidload
2个回答
0
投票

您需要为变量分配约束,并在需要更改它们时更改它们的常数。这是带有尾随约束的示例。无需更改锚,只需更改常量。这就是您的操作方式。

var iTrailingConstraint:NSLayoutConstraint?

override func viewDidLoad() {
   iTrailingConstraint = i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150).isActive = true
}

调用selena时,将常数设置为所需的常数。在控制器的视图上调用layoutIfNeeded()。

@objc func selena(){
  UIView.animate(withDuration: 0.5, animations: {
    self.iTrailingConstraint?.constant = 50
    self.view.layoutIfNeeded()
  })
}

0
投票

您可以保留对它们的引用,然后使用deactivate

© www.soinside.com 2019 - 2024. All rights reserved.