tvOS:无论如何都要检测长按箭头按钮?

时间:2016-09-27 17:16:01

标签: swift uigesturerecognizer tvos apple-tv

所以我一直试图检测到长按一个Apple TV遥控箭头按钮(触摸触摸板的边缘时触发),它似乎不适用于箭头,仅适用于你点击的物理按钮。基本上是:

print(l1, l2, sep='\n')
[0, 1, 2, -5, 4, 5, 6, 7, 8, 9]
[0, 1, 2, -5, 4, 5, 6, 7, 8, 9]

我尝试用// This works let longSelectRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressed(_:))) longSelectRecognizer.allowedPressTypes = [UIPressType.Select.rawValue)] self.addGestureRecognizer(longSelectRecognizer) // This doesn't let longArrowRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressed(_:))) longArrowRecognizer.allowedPressTypes = [NSNumber(integer: UIPressType.LeftArrow.rawValue), NSNumber(integer: UIPressType.RightArrow.rawValue)] self.addGestureRecognizer(longArrowRecognizer) 替换它,但是在按住箭头时没有检测到(正如预期的那样)

1 个答案:

答案 0 :(得分:1)

我相信这是因为向下/向上/向右/向左箭头是虚拟按压。他们从touchesBegan / Ended重新播出。

你可以检查向下/向上/向右/向左长按的唯一方法是在touchesBegan / Ended中计算touch.timestamp。

var touchStart: TimeInterval?

    override public func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        touches.forEach({ touch in
            switch touch.type{
                case .indirect:
                    self.touchStart = touch.timestamp
                break
                default:
                break
            }

        })
    }

    override public func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        touches.forEach({ touch in
            switch touch.type{
                case .indirect:
                    if
                        let start = self.touchStart,
                        (touch.timestamp - start < 0.5){
                        super.touchesEnded(touches, with: event)
                    }else {
                        self.performSegue(withIdentifier: SegueEnum.showOverlaySegue.rawValue, sender: nil)
                    }
                break
                default:
                break
            }
        })
    }