2015-03-25 8 views
14

Prima del layout automatico, ho animato l'altezza di uno sfondo in un progetto impostando il riquadro su animateWithDuration.Animare l'altezza di UIView quando si utilizza il layout automatico con swift

func setUpBackground() { 
    self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 10) 
    self.backgroundView.backgroundColor = UIColorFromRGB(0x2d2d2d).CGColor 
} 

func AnimateBackgroundHeight() { 
    UIView.animateWithDuration(0.5, animations: { 
     self.backgroundView.frame = CGRect(x: 0, y: 0, width: 320, height: 600)  
    }) 
} 

Dopo aver convertito il mio progetto di layout automatico, ho notato che l'animazione si verifica, ma l'altezza sfondo scatta di nuovo alla dimensione originale/style (impostazione costruttore di interfaccia) dopo. Ho letto che quando il layout automatico è attivo, i vincoli sovrascrivono impostando le dimensioni UIView con CGRect.

Pertanto mi chiedo come ottenere lo stesso effetto di animazione con modifica dell'altezza con Auto-layout ON.

risposta

35

Assegna al tuo backgroundView un vincolo di altezza e crea un IBOutlet. Nel codice, modifica il valore costante del vincolo.

func AnimateBackgroundHeight() { 
    UIView.animateWithDuration(0.5, animations: { 
     self.heightCon.constant = 600 // heightCon is the IBOutlet to the constraint 
     self.view.layoutIfNeeded()  
    }) 
} 
+0

Ah capisco! questo funziona alla grande Molte grazie. – Poyi

+0

omg .. layoutIfNeeded() ha fatto il trucco ... mi mancava –

5

anche per quelli di voi che trovano questo post cercando di capire il motivo per cui una transizione che cambia la dimensione di una vista sarà blocchi o impuro non vi resta che trovare la vista in carica e chiamare self.view.layoutIfNeeded() all'interno del blocco UIView.animateWithDuration. Stavo sbattendo la testa contro il muro provando cose diverse con vincoli e realizzando fotogrammi fino a rendermi conto che lo self.view.layoutIfNeeded() si manterrà rendendo la transizione fluida fintanto che la stai posizionando nella giusta posizione.

+1

Ho trascorso 7 ore cercando di capire perché il mio layout si stava rompendo durante l'animazione. Dopo aver visto i tuoi post mi sono reso conto che stavo chiamando layoutIfNeeded in una sottoview, non nella superview. Grazie!! – Starlord

Problemi correlati