Search code examples
swiftfunctionnslayoutconstraintviewdidload

deactivate nslayoutconstraint declared in viewdidload with function


My code below declares layout constraints in viewdidload. When the function Selena is called I would like the the constraints to be change to what is in the function selena. When I call the function the object I does not change. It has no effect. I know somehow I have to deactivate the original constraints.

   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),

    ])

}

Solution

  • You can hold a reference to them then use 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) 
        ])
    
    
    }
    

    height connstraint didn't change you can get it out of the array inside viewDidLoad

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

    and remove it from selena function