2017-01-18 2 views
1

Скажи мне это сделать ...Я добавляю еще одно или меняю это ограничение?

override func viewDidLoad() { 
    super.viewDidLoad() 
    view.heightAnchor.constraint(equalToConstant: 50).isActive = true 

позже, я делаю это ...

view.heightAnchor.constraint(equalToConstant: 51).isActive = true 

я плохой человек?

ли я теперь избыточно добавил второе ограничение (что происходит с первым?)

Или это знать, чтобы изменить первые?

Или что-то еще происходит? Я делаю утечку?

Что мне делать, и каким образом я был плохим, если таковой был?

Какая правильная вещь здесь?

ответ

3
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, это необязательно, так как оно изменено.)

+0

Мэтт, мог бы он оставить свой код как есть и просто вызвать 'setNeedsUpdateConstraints' после того, как он изменит ограничение? –

+0

@MSU_Bulldog No. Он не менял никаких ограничений (и не заменил ограничение). Он добавил второе ограничение по высоте. Это моя точка зрения. – matt

+0

Нет ли способа доступа к ограничению этого представления, чтобы обновить его, не создавая ссылку на него? Мне просто любопытно, как это сделать. Если мне нужно было обновить 5 различных ограничений, я бы не хотел иметь 5 отдельных ссылок для каждого отдельного ограничения –

Смежные вопросы