2016-09-14 3 views
16

Seit ich mein Projekt auf swift 3 hochgestuft habe, funktionieren meine Auto-Layout-Constraint Animationen nicht; um genauer zu sein, fangen sie eher an der neuen Position als an der Animation.Swift 3 UIView Animation

UIView.animate(withDuration: 0.1, 
       delay: 0.1, 
       options: UIViewAnimationOptions.curveEaseIn, 
       animations: {() -> Void in 
        constraint.constant = ButtonAnimationValues.YPosition.DefaultOut() 
        self.layoutIfNeeded() 
    }, completion: { (finished) -> Void in 
    // .... 
}) 

Ich weiß, dass sie hinzugefügt, um die UIViewPropertyAnimator Klasse bin aber noch, es zu versuchen.

+1

Ich habe in letzter Zeit nach einer Lösung gesucht. Viele haben das gleiche Problem und ich konnte es nicht mit dem neuen UIViewPropertyAnimator arbeiten lassen. Vielleicht ist es ein unaufgelöster Fehler in iOS 10. – diegotrevisan

+0

Haben Sie versucht, die Konstante vor dem Animate-Aufruf zu setzen? – lkraider

+0

@lkraider Ja, das schon versucht. –

Antwort

21

hatte ich dieses Problem auch mit dem neuesten Update auf rasche 3.

genau zu sein, wenn Sie die Ansicht animieren möchten, rufen Sie eigentlich layoutIfNeeded auf dem Super dieser Ansicht.

Versuchen Sie stattdessen:

UIView.animate(withDuration: 0.1, 
      delay: 0.1, 
      options: UIViewAnimationOptions.curveEaseIn, 
      animations: {() -> Void in 
       constraint.constant = ButtonAnimationValues.YPosition.DefaultOut() 
       self.superview?.layoutIfNeeded() 
}, completion: { (finished) -> Void in 
// .... 
}) 

Es scheint in der Vergangenheit sie nachsichtig waren über die Möglichkeit, nur Neu-Layout der Ansicht, die Sie animieren möchten. Aber es ist in der Dokumentation, dass Sie wirklich layoutIfNeeded in der Superview aufrufen sollten.

+0

Die Position ändert sich, aber es ist nicht animierend. – Satyam

+3

Bitte versuchen Sie diesen Code, es funktioniert für mich. UIView.animate (withDuration: 1, Verzögerung: 0, Optionen: .curveEaseInOut, Animationen: { self.bottomViewTopConstraint.constant = 0,0 self.bottomView.superview .layoutIfNeeded() ?}, Abschluss: null) – jbchitaliya

+0

Wow Dank. Tolle Lösung und ein seltsames Problem. – Siriss

7

Upgrade auf swift 3.0

Ansicht von rechts nach links Animation wie Apfel Standard Push-Animation

//intially set x = SCREEN_WIDTH 
view.frame = CGRect(x: ScreenSize.SCREEN_WIDTH, y: ScreenSize.SCREEN_HEIGHT - heightTabBar , width: ScreenSize.SCREEN_WIDTH, height: heightTabBar) 

UIView.animate(withDuration: 0.50, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0, options: [], animations: { 
//Set x position what ever you want 
         view.frame = CGRect(x: 0, y: ScreenSize.SCREEN_HEIGHT - heightTabBar , width: ScreenSize.SCREEN_WIDTH, height: heightTabBar) 

        }, completion: nil) 
5

zuerst den neuen Wert für die Einschränkung festgelegt und dann belebte nennen.

self.YOUR_CONSTRAINT.constant = NEW_VALUE 
UIView.animate(withDuration: 1.0) { 
    self.view.layoutIfNeeded() 
} 
0

Swift 3.1, Xcode 8.3.2

Dieser Code funktioniert gut für mich. Alle Änderungen in Ihrer Ansicht werden in Zeitlupe animiert.

UIView.animate(withDuration: 3.0, animations: { // 3.0 are the seconds 

// Write your code here for e.g. Increasing any Subviews height. 

self.view.layoutIfNeeded() 

})