如果 LongPressReconizerState 结束,预定的计时器不会结束

scheduled timer does not end, if LongPressReconizerState is end


我尝试通过 AVAudioPlayer 构建一个音乐播放器。我的音频播放器工作了!现在我尝试构建倒带功能,这是一个双功能按钮:

  1. 一次点击:播放器从头开始(player.currentTime = 0)(有效)
  2. Longpess:播放器以 0.5 秒的步长开始倒带,并在释放按钮时结束 "rewind process"

我的代码(摘要)

var player = AVAudioPlayer()
@IBOutlet weak var rewindButton: UIButton!

override func viewDidLoad() {
        super.viewDidLoad()
        let tapGesture = UITapGestureRecognizer(target: self, action:    #selector(rewindTapAction))  //Tap function will call when user tap on button
        let longGesture = UILongPressGestureRecognizer(target: self, action: #selector(rewindLongPressAction(_:))) //Long function will call when user long press on button.
        tapGesture.numberOfTapsRequired = 1
        rewindButton.addGestureRecognizer(tapGesture)
        rewindButton.addGestureRecognizer(longGesture)
} 

@objc func rewindTapAction(){
    print("tapped")
    player.currentTime = TimeInterval(0)
}

@objc func rewindLongPressAction(_ gestureRecognizer: UILongPressGestureRecognizer){
    print("longpress")
    var rewindTimer : Timer!

    if gestureRecognizer.state == .began{
        print("longpress started")

        rewindTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true, block: { Timer in
                            self.player.currentTime = TimeInterval( self.player.currentTime - 0.5)
                            print("timer")
                        })

    }else if gestureRecognizer.state == .ended || gestureRecognizer.state == .cancelled{
        print("longpress ended")
        rewindTimer.invalidate()
    }

}




我的问题是:

在我松开rewindButton(长按)后,倒带计时器没有停止。为什么?

您应该在 rewindLongPressAction 函数的范围之外定义 rewindTimer。当您的函数以手势状态 .ended 再次被调用时,它不再具有对 rewindTimer 的相同引用。