2014-09-03 13 views
131

Ich habe ein UITextField, das ich vergrößern möchte, wenn es angetippt wird. Ich habe die Einschränkungen eingerichtet und dafür gesorgt, dass die Beschränkung auf der linken Seite die niedrigere Priorität hat als die, die ich auf der rechten Seite zu animieren versuche.versuche, eine Einschränkung in swift zu animieren

Hier ist der Code, den ich versuche zu verwenden.

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

Dies funktioniert, aber es scheint einfach nur passieren und es scheint keine Bewegung zu sein. Ich habe versucht, es 10 Sekunden einzustellen, um sicherzustellen, dass ich nichts vermisse, aber ich habe die gleichen Ergebnisse.

nameInputConstraint ist der Name der Einschränkung, die ich kontrolliere, gezogen, um von IB in meine Klasse zu verbinden.

Vielen Dank für Ihre Hilfe im Voraus!

+1

möglich Duplikat von [Wie animieren ich Änderungen Einschränkung?] (Http://stackoverflow.com/questions/12622424/how-do-i-animate-constraint-changes) –

Antwort

398

Sie müssen zuerst die Einschränkung ändern und dann das Update animieren.

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

Und in Swift 3.0:

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

Kann mir jemand erklären, wie/warum das funktioniert? Das Aufrufen von animationWithDuration auf einem beliebigen UIView animiert jede Klasse, die von UIView erbt und einen physischen Wert ändert? – nipponese

+2

Die von Ihnen erwähnte Animations-API wird zum Animieren der * Eigenschaften * von Ansichten und Ebenen verwendet. Hier müssen wir die * Änderung im Layout * animieren. Das erfordert die Änderung der Konstanten einer Layoutbeschränkung - das Ändern der Konstanten alleine tut nichts. – Mundi

+0

Danke @ryan, um diese Antwort mit Swift 3.0 zu vervollständigen. – Mundi

1

In meinem Fall habe ich die benutzerdefinierte Ansicht nur aktualisiert.

// 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() 
} 
Verwandte Themen