Swift 使用函数停用viewdidload中声明的nslayoutconstraint

Swift 使用函数停用viewdidload中声明的nslayoutconstraint,swift,function,nslayoutconstraint,viewdidload,Swift,Function,Nslayoutconstraint,Viewdidload,下面的代码声明了viewdidload中的布局约束。调用函数Selena时,我希望将约束更改为函数Selena中的约束。当我调用函数对象时,我不会改变。它没有效果。我知道我必须取消原始约束 override func viewDidLoad() { NSLayoutConstraint.activate ([ i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),

下面的代码声明了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

  var oldCons = [NSLayoutConstraint]()

   override func viewDidLoad() {
       super.viewDidLoad()
     oldCons = [
        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)
     ]
    NSLayoutConstraint.activate(oldCons)

}


@objc func selena(){

    NSLayoutConstraint.deactivate(oldCons)
    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) 
    ])


}

高度connstraint未更改您可以将其从
viewDidLoad中的数组中取出

 i.heightAnchor.constraint(equalToConstant: 450).isActive = true
并将其从
selena
功能中删除