2014-09-03 4 views
131

Ho un campo UIText che voglio ingrandire la sua larghezza quando viene toccato. Ho impostato i vincoli e mi sono assicurato che il vincolo a sinistra avesse la priorità più bassa di quella che sto cercando di animare sul lato destro.tentativo di animare un vincolo in swift

Ecco il codice che sto cercando di utilizzare.

// move the input box 
    UIView.animateWithDuration(10.5, animations: { 
     self.nameInputConstraint.constant = 8 
     }, completion: { 
      (value: Bool) in 
      println(">>> move const") 
    }) 

Questo funziona, ma sembra accadere immediatamente e non sembra esserci alcun movimento. Ho provato a impostarlo per 10 secondi per assicurarmi che non mi mancasse nulla, ma ho ottenuto gli stessi risultati.

nameInputConstraint è il nome del vincolo che controllo trascinato per connettersi alla classe da IB.

Grazie per il vostro aiuto in anticipo!

+1

possibile duplicato di [Come faccio animare cambiamenti vincolo?] (Http://stackoverflow.com/questions/12622424/how-do-i-animate-constraint-changes) –

risposta

398

È necessario prima modificare il vincolo e quindi animare l'aggiornamento.

self.nameInputConstraint.constant = 8 
UIView.animateWithDuration(0.5) { 
    self.view.layoutIfNeeded() 
} 

E a Swift 3.0:

UIView.animate(withDuration: 0.5) { 
    self.view.layoutIfNeeded() 
} 
+0

qualcuno può spiegare come/perché questo funziona? Chiamando animationWithDuration su qualsiasi UIView si animerà qualsiasi classe che eredita da UIView e cambia un valore fisico? – nipponese

+2

L'API di animazione menzionata viene utilizzata per animare le * proprietà * di viste e livelli. Qui abbiamo bisogno di animare il * cambiamento nel layout *. Questo è ciò che richiede la modifica della costante di un vincolo di layout: cambiare la costante da sola non fa nulla. – Mundi

+0

Grazie a @ryan, per aver completato questa risposta con Swift 3.0. – Mundi

1

Nel mio caso, ho solo aggiornato la visualizzazione personalizzata.

// DO NOT LIKE THIS 
customView.layoutIfNeeded() // Change to view.layoutIfNeeded() 
UIView.animate(withDuration: 0.5) { 
    customViewConstraint.constant = 100.0 
    customView.layoutIfNeeded() // Change to view.layoutIfNeeded() 
}