简体   繁体   中英

Swift: animateWithDuration behavior

I have made simple animation of text and buttons to came from out of the screen to middle of the screen, but it doesn't. It goes from screen, to out of the screen. Basically, animation is reversed.

I have seen that other apps works the way I wont with same code, so I do not know what is wrong. :(

Here is the code:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var welcomeText: UILabel!
@IBOutlet weak var worksText: UILabel!
@IBOutlet weak var loginButton: UIButton!
@IBOutlet weak var signUp: UIButton!
@IBOutlet weak var socialLog: UILabel!

override func viewDidLoad() {
    super.viewDidLoad()

}

override func viewWillAppear(animated: Bool) {

    welcomeText.alpha = 0.0
    worksText.alpha = 0.0
    loginButton.alpha = 0.0
    signUp.alpha = 0.0
    socialLog.alpha = 0.0

    welcomeText.center.x -= view.bounds.width
    worksText.center.x -= view.bounds.width
    socialLog.center.x -= view.bounds.width
    signUp.center.x -= view.bounds.width
}

override func viewDidAppear(animated: Bool) {

    self.welcomeText.fadeIn()
    UIView.animateWithDuration(0.7, delay: 0.1, options: .CurveEaseOut, animations: {
        self.welcomeText.center.x += self.view.bounds.width
        self.view.layoutIfNeeded()
        }, completion: nil)

    self.worksText.fadeIn()
    UIView.animateWithDuration(0.7, delay: 0.5, options: .CurveEaseOut, animations: {
        self.worksText.center.x += self.view.bounds.width
        self.view.layoutIfNeeded()
        }, completion: nil)

    self.socialLog.fadeIn()
    UIView.animateWithDuration(0.7, delay: 0.3, options: .CurveEaseOut, animations: {
        self.socialLog.center.x += self.view.bounds.width
        self.view.layoutIfNeeded()
        }, completion: nil)

    self.signUp.fadeIn()
    UIView.animateWithDuration(0.7, delay: 0.7, options: .CurveEaseOut, animations: {
        self.signUp.center.x += self.view.bounds.width
        self.signUp.alpha = 0.5
        self.view.layoutIfNeeded()
        }, completion: nil)
}
}

extension UIView {
func fadeIn(duration: NSTimeInterval = 0.5, delay: NSTimeInterval = 0.0, completion: ((Bool) -> Void) = {(finished: Bool) -> Void in}) {
    UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseIn, animations: {
        self.alpha = 1.0
        }, completion: completion)  }

func fadeOut(duration: NSTimeInterval = 0.5, delay: NSTimeInterval = 0.0, completion: (Bool) -> Void = {(finished: Bool) -> Void in}) {
    UIView.animateWithDuration(duration, delay: delay, options: UIViewAnimationOptions.CurveEaseIn, animations: {
        self.alpha = 0.0
        }, completion: completion)
}
}

Information about where the views started would be required to debug this. However, I would strongly recommend against using += or -= for animations like this. As you're experiencing, it's behavior is unpredictable since it depends entirely on the current state.

Instead, you could do this in the viewWillAppear: *view*.center.x = -(*view*.frame.width / 2) and in viewDidAppear: view .center.x = whatever value you need here

Also, the more up to date approach for all of this is to use and animate constraints, rather than frames.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM