деактивировать nslayoutconstraint, объявленный в viewdidload с помощью функции - PullRequest
0 голосов
/ 19 октября 2019

Мой код ниже объявляет ограничения макета в 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),

    ])

}

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Вы можете удерживать ссылку на них, затем использовать 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 функции

0 голосов
/ 19 октября 2019

Вам необходимо присвоить ограничения переменным и изменить их константу, когда вам нужно их изменить. Вот пример с вашим трейлинг-ограничением. НЕТ необходимости менять якорь, только постоянную. Вот как вы это делаете.

var iTrailingConstraint:NSLayoutConstraint?

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

Когда вызывается Селена, вы оживляете константу до желаемой. Вызовите layoutIfNeeded () в представлении контроллера

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