2015-02-04 10 views
9

Il mio obiettivo è animare un UIImageView. Ho dichiarato uno NSLayoutConstraint in viewDidLoad. In viewDidLoad, ho usato questo codice:Come si anima un NSLayoutConstraint in Swift?

UIView.animateWithDuration(1, animations: { 
    myConstraint.constant = 100 
    self.view.layoutIfNeeded() 
}, completion: {finished in }) 

Perché non la mia immagine si muove?

+0

Utilizzando il codice di esempio nella sua domanda così come sono! – SwiftArchitect

risposta

28

Nel momento in cui si preme viewDidLoad, il motore dei vincoli non è stato ancora applicato e la posizione iniziale delle viste non è stata ancora stabilita. Quindi, sentiti libero di aggiungere i vincoli originali in viewDidLoad, ma dovrai rinviare lo animateWithDuration fino a un momento successivo (ad esempio viewDidAppear).


Ad esempio, si supponga di avere un vincolo aggiunto in Interface Builder (IB). È possibile aggiungere un @IBOutlet riferimento ad esso per controllo -trascinamento dal vincolo nella struttura del documento nel pannello di sinistra in Interface Builder fino al assistente al montaggio:

enter image description here

Ora che avete un riferimento a tale vincolo, è ora possibile modificare il valore di programmazione constant per quel vincolo (ma, ancora una volta, farlo in viewDidAppear, non viewDidLoad, se si desidera vedere questo animato quando la vista si presenta):

@IBOutlet weak var topConstraint: NSLayoutConstraint! 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    topConstraint.constant = 100 
    UIView.animateWithDuration(2.0) { 
     self.view.layoutIfNeeded() 
    } 
} 

Il processo è lo stesso per i vincoli creati a livello di codice. Basta salvare un riferimento al vincolo e quindi in viewDidAppear aggiornare constant e quindi animare la chiamata a layoutIfNeeded().

+0

Si prega di aggiungere alcune spiegazioni di dettaglio ... – Tuhin

+0

Se è possibile per voi quindi si prega di inviare un po 'di codice con le spiegazioni ... Grazie a proposito per la vostra risposta .. – Tuhin

+0

@iCrunCher - Vedere la risposta rivista. – Rob

6

preghiamo di impostare le vincolo in viewDidAppear e cercare sotto la correzione

myConstant = 100 
myConstraint.constant = myConstant 
UIView.animateWithDuration(1, animations: { 
self.view.layoutIfNeeded() 
}, completion: {finished in }) 
+0

questo ha risolto i miei problemi di animazione, grazie un mucchio !!! –

Problemi correlati