2016-06-08 11 views
6

Ho un UIStackView con 5 subviews. Voglio essere in grado di animare la larghezza di queste sottoview aggiornando il loro intrinsicContentSize o aggiornando i loro vincoli. Come posso ridisegnare lo stackView dopo aver aggiornato il layout della subview?Come posso ottenere un UIStackView per aggiornare il layout?

 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 
}) 

Ho provato vari modi per cercare di aggiornare lo stackView, ma non succede nulla. L'unico modo per farlo funzionare è se mostro/nascondi un'altra sottoview all'interno del blocco di animazione, quindi il nuovo layout è animato correttamente, ma non voglio farlo.

ho visto questa domanda Animating UIStackView arrangedSubview content size change ma la risposta suggerita non funziona (niente di anima).

+0

hai provato view.updateConstraints? –

+0

Sì, nello stackView e nelle sottoview, nessuno dei due ha alcun effetto. –

risposta

6

Non è necessario viewToResize.invalidateIntrinsicContentSize(), aggiornare invece il vincolo delle subview. Nel codice seguente, abbiamo due sottoview nello stackView e creiamo una presa widthConstraint dallo storyboard. Quindi possiamo animare la larghezza della sottoview aggiornando la costante di widthConstraint nel blocco di animazione. Nota: Se una vista è contenuta in una vista stack e si tenta di modificare il telaio vista, non dovrebbe cambiare

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) 
    } 

Per maggiori dettagli, si può dare un'occhiata a questa grande blog UIStackView, Auto Layout and Core Animation

+0

Come dovrei farlo se voglio che 1 subview abbia una larghezza fissa e l'altra per riempire lo spazio disponibile? (Voglio passare tra le visualizzazioni) Ho provato a rimuovere/aggiungere vincoli nel blocco di animazione e funziona, ma rompe altri vincoli. –

+0

In realtà l'aggiunta e la rimozione dei vincoli funziona bene, ma ho dovuto abbassare la priorità per fermare l'interruzione di altri vincoli. –

+0

Ho appena aggiornato il collegamento. – luiyezheng

Problemi correlati