Swift 3 UIView animation

47,153

Solution 1

I had this problem too with the newest update to swift 3.

To be exact, whenever you want to animate the view, you actually call layoutIfNeeded on the superview of that view.

Try this instead:

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

It seems in the past they've been lenient about being able to just relayout the view you want to animate. But its in the documentation that you should really be calling layoutIfNeeded in the superview.

Solution 2

First set the new value for your constraint and then call animate.

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

Solution 3

Upgrade to swift 3.0

View right to left animation like apple default 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)

Solution 4

Swift 3.1 , Xcode 8.3.2

This code works well for me. Any changes on your view will animate in slow motion.

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

})

Solution 5

Swift 4, Xcode 10

Right to Left animation for search

//intially set x = Your_View_Width

    viewOfSearch.frame = CGRect(x: viewOfSearch.frame.size.width, y: 0 , width: viewOfSearch.frame.size.width, height: 50)

    UIView.animate(withDuration: 0.50, delay: 0.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 0, options: [], animations: {
        //Set x position what ever you want
        self.viewOfSearch.frame = CGRect(x: 0, y: 0 , width: self.viewOfSearch.frame.size.width, height: 50)

    }, completion: nil)
Share:
47,153

Related videos on Youtube

Alex Brown
Author by

Alex Brown

Lead mobile developer at ETX Capital

Updated on March 15, 2021

Comments

  • Alex Brown
    Alex Brown about 3 years

    Since upgrading my project to swift 3 my autolayout constraint animations aren't working; to be more specific, they're snapping to the new position rather than animating.

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

    I know they added the UIViewPropertyAnimator class but am yet to try it.

    • diegotrevisan
      diegotrevisan over 7 years
      I've been searching for a solution about this lately. Many are having the same issue, and I couldn't make it work even with the new UIViewPropertyAnimator. Maybe it is an unresolved bug in iOS 10.
    • lkraider
      lkraider over 7 years
      Did you try setting the constant before the animate call?
    • Alex Brown
      Alex Brown over 7 years
      @lkraider Yes already tried that.
    • Alex Brown
      Alex Brown over 7 years
      Still no definite answer as to why this isn't working, the code works fine in the iOS9 sim. For now i've set self.translatesAutoresizingMaskIntoConstraints = true on my view and am animating the origin.
  • Satyam
    Satyam over 7 years
    Position is changing but its not animating.
  • jbchitaliya
    jbchitaliya over 7 years
    Please try this code, its work for me. UIView.animate(withDuration: 1, delay: 0, options: .curveEaseInOut , animations: { self.bottomViewTopConstraint.constant = 0.0 self.bottomView.superview?.layoutIfNeeded() }, completion: nil)