淡入按钮,这样它就不会再自动淡出

时间:2017-12-08 18:20:05

标签: ios swift animation button timer

我正在使用点击手势识别器,因此如果用户点击屏幕,按钮会淡出5秒钟,然后如果用户想要再次看到屏幕上的按钮,他们会点击屏幕并且按钮会淡入。

问题是:

我淡入时无法禁用该按钮,因此它不会再自动淡出。我试图使计时器无效,但这不起作用。更具体地说明我想做的事情:

在应用加载时,您会看到启用的“开始停止按钮”。 - 点击屏幕上的任意位置,5秒计时器开始淡出按钮并禁用它。一旦按钮淡出并禁用,我可以点击屏幕上的任何地方淡入按钮,启用它,然后终止计时器,使按钮显示为我第一次点击之前的状态。

 class ViewController: UIViewController {
    // Create these 3 properties in the top of your class
    var secondToFadeOut = 5 // How many second do you want the view to idle before the button fades. You can change this to whatever you'd like.
    var timer = Timer() // Create the timer!
    var isTimerRunning: Bool = false // Need this to prevent multiple timers from running at the same time.


@IBOutlet weak var startStopButton: UIButton! // The outlet for your button. This is used to fade it in and out, and enable / disable it.

override func viewDidLoad() {
    super.viewDidLoad()
    startStopButton.isEnabled = true
    runTimer()

    // Add a tap gesture recognizer to the main view to determine when the screen was tapped (for the purpose of resetting the timer).
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tap(_:)))
    self.view.addGestureRecognizer(tapRecognizer)

}

func runTimer() {
    // Create the timer to run a method (in this case... updateTimer) every 1 second.
    timer = Timer.scheduledTimer(timeInterval: 1, target: self,   selector: (#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
    // Set the isTimerRunning bool to true
    isTimerRunning = true
}

@objc func updateTimer() {
    // Every 1 second that this method runs, 1 second will be chopped off the secondToFadeOut property. If that hits 0 (< 1), then run the fadeOutButton and invalidate the timer so it stops running.
    secondToFadeOut -= 1
    print(secondToFadeOut)
    if secondToFadeOut < 1 {
        fadeOutButton()
        timer.invalidate()
        isTimerRunning = false
    }
}

@objc func tap(_ gestureRecognizer: UITapGestureRecognizer) {
    // When the view is tapped (based on the gesture recognizer), reset the secondToFadeOut property, fade in (and enable) the button.
    //secondToFadeOut = 5
    fadeInButton()
    timer.invalidate()
    //if isTimerRunning == false {
    //    runTimer()
    //}
}

func fadeOutButton() {
    // Fade out your button! I also disabled it here. But you can do whatever your little heart desires.
    UIView.animate(withDuration: 0.5) {
        self.startStopButton.alpha = 0.25
    }
    self.startStopButton.isEnabled = false
}
func fadeInButton() {
    // Fade the button back in, and set it back to active (so it's tappable)
    UIView.animate(withDuration: 0.5) {
        self.startStopButton.alpha = 1
    }
    self.startStopButton.isEnabled = true
}


@IBAction func startStopButtonPressed(_ sender: UIButton) {
    print("Start Stop Button Pressed")
}
}

1 个答案:

答案 0 :(得分:0)

我最好的猜测是你有一个流氓Timer对象,即使在你的当前计时器无效之后仍留在内存中,这会导致按钮在淡入后再次淡出。

我已经为你的班级做了几次修改。检查代码:

 class ViewController: UIViewController {
// Create these 3 properties in the top of your class
var secondToFadeOut = 5 // How many second do you want the view to idle before the button fades. You can change this to whatever you'd like.
var timer? = nil // Create the timer!

@IBOutlet weak var startStopButton: UIButton! // The outlet for your button. This is used to fade it in and out, and enable / disable it.

override func viewDidLoad() {
    super.viewDidLoad()
    startStopButton.isEnabled = true
    runTimer()

    // Add a tap gesture recognizer to the main view to determine when the screen was tapped (for the purpose of resetting the timer).
    let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.tap(_:)))
    self.view.addGestureRecognizer(tapRecognizer)
}

func runTimer() {
    if timer == nil {
        timer = Timer.scheduledTimer(timeInterval: secondToFadeOut, target: self,   selector: (#selector(ViewController.timerFired)), userInfo: nil, repeats: false)
    }
}

@objc func timerFired() {
    timer = nil
    if self.startStopButton.isEnabled {
        fadeOutButton()
    } else {
        fadeInButton()
    }
}

@objc func tap(_ gestureRecognizer: UITapGestureRecognizer) {
    runTimer()
}

func fadeOutButton() {
    UIView.animate(withDuration: 0.5) {
        self.startStopButton.alpha = 0.25
    }
    self.startStopButton.isEnabled = false
}

func fadeInButton() {
    UIView.animate(withDuration: 0.5) {
        self.startStopButton.alpha = 1
    }
    self.startStopButton.isEnabled = true
}

@IBAction func startStopButtonPressed(_ sender: UIButton) {
    print("Start Stop Button Pressed")
}
}