2016-06-08 3 views
6

У меня есть UIStackView с 5 подземельями. Я хочу иметь возможность анимировать ширину этих представлений, обновляя их intrinsicContentSize или обновляя их ограничения. Как я могу сделать redView stackView после обновления макета subview?Как получить UIStackView для обновления его макета?

 UIView.animateWithDuration(0.3, animations: { 
      viewToResize.compressed = true //changes intrinsicContentSize 
      viewToResize.invalidateIntrinsicContentSize() 
      self.stackView.layoutIfNeeded() //makes no difference 
      anotherSubview.hidden = true //adding this makes everything work 
}) 

Я пробовал различные способы попытаться обновить stackView, но ничего не происходит. Единственный способ заставить его работать, если я покажу/скрываю другое подвью внутри блока анимации, то новый макет анимируется правильно, но я не хочу этого делать.

Я видел этот вопрос Animating UIStackView arrangedSubview content size change но предлагаемый ответ не работает (ничего не оживляет).

+0

вы пробовали view.updateConstraints? –

+0

Да, в stackView и subviews нет никакого эффекта. –

ответ

6

Вам не нужно viewToResize.invalidateIntrinsicContentSize(), вместо этого вместо этого нужно ограничить обновление своих подзонов. В приведенном ниже коде у нас есть два подзаголовка в stackView, и мы создаем вывод widthConstraint из раскадровки. Затем мы можем анимировать ширину поднабора, обновляя константу widthConstraint в блоке анимации. Примечание: Если представление содержится в представлении стека, и вы пытаетесь изменить вид кадра, он не должен менять

class ViewController: UIViewController { 
    @IBOutlet var widthConstraint: NSLayoutConstraint! 

    @IBOutlet var stackView: UIStackView! 
    var compressed: Bool = true 

    @IBOutlet var start: UIButton! 

    @IBAction func onStart(sender: UIButton) { 
     UIView.animateWithDuration(3.0, 
            delay: 0.0, 
            usingSpringWithDamping: 0.3, 
            initialSpringVelocity: 10.0, 
            options: .CurveLinear, 
            animations: {() -> Void in 
            //self.stackView.invalidateIntrinsicContentSize() 
            self.widthConstraint.constant = (self.compressed == false) ? 100.0 : 200.0 
            self.compressed = !self.compressed 
            self.view.layoutIfNeeded() 
      }, completion: nil) 
    } 

Для получения более подробной информации, Вы можете посмотреть на этот замечательный блог UIStackView, Auto Layout and Core Animation

+0

Как бы это сделать, если я хочу, чтобы 1 subview имел фиксированную ширину, а другой - для заполнения доступного пространства? (Я хочу переключиться между представлениями) Я попытался удалить/добавить ограничения в блоке анимации, и он работает, но нарушает другие ограничения. –

+0

Фактически добавление и удаление ограничений работает хорошо, но мне пришлось понизить приоритет, чтобы остановить другие нарушения. –

+0

Я только что обновил ссылку. – luiyezheng

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