0

我试图仅在用户开始平移 0.3 秒时才显示按钮,以避免在某些情况下立即显示按钮(例如,如果手指没有一起抬起,则在缩放结束时)。为此,我在平移手势处于.began状态时启动 Timer,然后.changed仅在 timer 变为 nil 时才显示处于状态的按钮。

但是,直到我抬起手指(即手势是.ended),我的计时器才开始运行。我认为这可能与运行循环和手势占用主线程有关?任何解决方法将不胜感激。谢谢!

var timer: Timer?

func handler(_ sender: UIPanGestureRecognizer) {
    switch sender.state {
    case .began:
        if timer == nil {
            // I just want timer to invalidate itself after firing, so nothing to execute
            self.timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: false, block: { _ in })
    case .changed:
        if button.isHidden && timer == nil {
            button.isHidden = false
        }
    case .ended:
        button.isHidden = true
        timer?.invalidate()
        timer = nil
    default:
        return
    }
}
4

2 回答 2

0

如果您的主要目标是在用户开始平移 0.3 秒后仅显示按钮,那么您需要做的就是检测平移手势何时移动,然后显示按钮。您甚至不需要在手势开始时创建计时器。

var timer: Timer?

func handler(_ sender: UIPanGestureRecognizer) {

    switch sender.state {
    case .changed:
        if (timer == nil || timer?.isValid == false) {
            timer = Timer.scheduledTimer(withTimeInterval: 0.3, repeats: false) { (_) in
                // Show button
                self.button.isHidden = false
            }
        }
    case .ended :
        button.isHidden = true
        timer?.invalidate()
    default:
        return
    }
}
于 2018-02-09T16:46:20.897 回答
-1

尝试这个:

    var timer: Timer?

    func handler(_ sender: UIPanGestureRecognizer) {
        switch sender.state {
        case .began:
            if timer == nil {
                self.timer = Timer.scheduledTimer(
                withTimeInterval: 0.3, 
                repeats: false, 
                block: { [weak self] _ in
                   self?.button.isHidden = false 
                })
        case canceled, .ended:
            timer?.invalidate()
            timer = nil
        default:
            return
        }
    }
于 2018-02-09T14:28:41.143 回答