view.heightAnchor.constraint(equalToConstant: 50).isActive = true
позже, я делаю это ...
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
я плохой человек?
Да, и если я не ошибаюсь, время выполнения сообщит об этом с громким сообщением в консоли, предупреждающим, что у вас есть неудовлетворительные (противоречивые) ограничения. У вас есть ограничение, устанавливающее высоту до 50, а другое - значение высоты до 51, и обе вещи не могут быть правдой.
Вы не дали достаточно коды, чтобы быть уверенными в том, что происходит в вашем случае, но вы можете легко увидеть, что то, что я говорю правильно, делая код вашей точки зрения контроллера состоит только из следующих действий:
func delay(_ delay:Double, closure:@escaping()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(v)
v.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
v.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
v.widthAnchor.constraint(equalToConstant: 100).isActive = true
v.heightAnchor.constraint(equalToConstant: 50).isActive = true
delay(3) {
v.heightAnchor.constraint(equalToConstant: 51).isActive = true
}
}
}
Как вы уже определили, мы «позже» добавим ограничение 51, и, как я уже сказал, скрюки времени выполнения в этот момент.
Правильная процедура заключается в сохранить ссылку на исходное ограничение , так что вы можете изменить его constant
позже. (При более сложных обстоятельствах вы можете фактически деактивировать, т. Е. Удалить первое ограничение перед добавлением второго, но если все, что вы планируете сделать, это изменить constant
, это необязательно, так как оно изменено.)
Мэтт, мог бы он оставить свой код как есть и просто вызвать 'setNeedsUpdateConstraints' после того, как он изменит ограничение? –
@MSU_Bulldog No. Он не менял никаких ограничений (и не заменил ограничение). Он добавил второе ограничение по высоте. Это моя точка зрения. – matt
Нет ли способа доступа к ограничению этого представления, чтобы обновить его, не создавая ссылку на него? Мне просто любопытно, как это сделать. Если мне нужно было обновить 5 различных ограничений, я бы не хотел иметь 5 отдельных ссылок для каждого отдельного ограничения –