2016-09-14 22 views
16

Od uaktualnienia mojego projektu do szybkiego 3 moje animacje z ograniczeniami autolayout nie działają; aby być bardziej szczegółowym, przyciągają się do nowej pozycji, zamiast animować.Swift 3 UIView animacja

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 
    // .... 
}) 

wiem dodali klasę UIViewPropertyAnimator ale jestem jeszcze spróbować.

+1

Ostatnio szukałem rozwiązania tego problemu. Wiele z nich ma ten sam problem i nie mogłem sprawić, by działało to nawet z nowym UIViewPropertyAnimator. Być może jest to nierozwiązany błąd w iOS 10. – diegotrevisan

+0

Czy próbowałeś ustawić stałą przed wywołaniem animate? – lkraider

+0

@lkraider Tak, już wypróbowałem. –

Odpowiedz

21

miałem ten problem też z najnowszej aktualizacji do szybkiego 3.

Aby być dokładne, gdy chcesz animować widoku, faktycznie nazwać layoutIfNeeded na SuperView tego widoku.

Spróbuj to zamiast:

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 
// .... 
}) 

Wydaje się w przeszłości byli wyrozumiali o byciu w stanie po prostu relayout widoku, który chcesz animować. Ale to jest w dokumentacji, którą naprawdę powinieneś wywoływać layoutIfNeeded w superview.

+0

Pozycja się zmienia, ale nie jest animowana. – Satyam

+3

Proszę spróbuj tego kodu, jego praca dla mnie. UIView.animate (withDuration: 1, opóźnienie 0 opcje: .curveEaseInOut animacje { self.bottomViewTopConstraint.constant = 0,0 self.bottomView.superview .layoutIfNeeded() ?} Realizacji: ml) – jbchitaliya

+0

wow dzięki. Świetna poprawka i dziwny problem. – Siriss

7

Upgrade do szybkiego 3,0

Widok od prawej do lewej animacji jak jabłko domyślnej animacji Push

//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

Najpierw należy ustawić nową wartość dla przymusu, a następnie wywołać ożywioną.

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

Swift 3.1, Xcode 8.3.2

Ten kod działa dobrze dla mnie. Wszelkie zmiany w widoku będą animowane w zwolnionym tempie.

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() 

})