2015-07-11 4 views
2

У меня есть два состояния UIView:Почему layoutIfNeeded() позволяет выполнять анимацию при обновлении ограничений?

enter image description here enter image description here

У меня есть анимации между ними с помощью @IBaction для button:

@IBAction func tapped(sender: UIButton) { 
    flag = !flag 
    UIView.animateWithDuration(1.0) { 
     if self.flag { 
      NSLayoutConstraint.activateConstraints([self.myConstraint]) 
     } else { 
      NSLayoutConstraint.deactivateConstraints([self.myConstraint]) 
     } 
     self.view.layoutIfNeeded() //additional line 
    } 
} 

Анимация работает только тогда, когда я добавить дополнительную строку:

Но когда я эмулировать эту строку, тогда обновляется UIView, но без анимации это происходит немедленно.

Почему эта линия имеет такое значение? Как это работает?

ответ

2

Как я понимаю, изменение ограничения не обновляет макет ваших просмотров сразу. Он приостанавливает изменения, и они выполняются только при следующем обновлении макета системы.

Поставив layoutIfNeeded внутри вашего блока анимации, он заставляет изменения вида применяться во время блока анимации. В противном случае они состоятся позже, после того, как анимация будет настроена.

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