下面的代码在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),
])
}
您需要为变量分配约束,并在需要更改它们时更改它们的常数。这是带有尾随约束的示例。无需更改锚,只需更改常量。这就是您的操作方式。
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()
})
}
您可以保留对它们的引用,然后使用deactivate