【问题标题】:deactivate nslayoutconstraint declared in viewdidload with function用函数停用在 viewdidload 中声明的 nslayoutconstraint
【发布时间】:2019-10-19 01:23:31
【问题描述】:

我下面的代码在 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


    【解决方案1】:

    您可以保留对它们的引用,然后使用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) 
        ])
    
    
    }
    

    高度约束没有改变,你可以将它从viewDidLoad中的数组中取出

     i.heightAnchor.constraint(equalToConstant: 450).isActive = true
    

    并将其从selena 函数中删除

    【讨论】:

      【解决方案2】:

      您需要将约束分配给变量,并在需要更改它们时更改它们的常量。这是带有尾随约束的示例。无需更改锚点,只需更改常量即可。这就是你的做法。

      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()
        })
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多