3

我正在 swift spritekit 中为 tvOS 开发游戏。有一个显示 SKScene B 的视图控制器 A。我将 pressesBegan 和 pressesEnded 从 A 转发到 B。

pressesBegan 在 A 中被调用并转发到 B,但在 A 中甚至没有调用 pressesBegan。我不明白为什么?

下面是A中实现的功能。

override func pressesEnded(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {
    if ((self.view as! SKView).scene?.isMemberOfClass(GameScene) == true){
        let gameScene = (self.view as! SKView).scene as! GameScene
        gameScene.pressesEnded(presses, withEvent: event)
    }

}

override func pressesBegan(presses: Set<UIPress>, withEvent event: UIPressesEvent?) {

    if ((self.view as! SKView).scene?.isMemberOfClass(GameScene) == true){
        let gameScene = (self.view as! SKView).scene as! GameScene
        gameScene.pressesBegan(presses, withEvent: event)
    }
}
4

3 回答 3

0

看起来有某种错误pressesEnded没有被及时调用。我注意到在pressesEndedand上放了一个断点pressesBegan。它总是停在 上pressesBegan,但只有pressesEnded在等待一秒钟后才会继续。

我能找到的唯一解决方法是将其添加到viewDidLoad

let menuPressRecognizer = UITapGestureRecognizer()
menuPressRecognizer.addTarget(self, action: #selector(ShowListViewController.menuButtonAction))
menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPressType.menu.rawValue)]
self.view.addGestureRecognizer(menuPressRecognizer)

然后这个:

func menuButtonAction() {
    print("menu pressed")
    UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
}

顺便说一句,这是swift 3。

于 2016-12-21T17:41:27.020 回答
0

我自己也遇到了这个。

我相信发生的事情是,如果您覆盖该方法:

- (void)pressesBegan:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event

并且不要在某处的方法中调用 super :

[super pressesBegan:presses withEvent:event];

pressEnded 也永远不会被调用。

我有一种情况,有时会调用 pressesEnded,有时不会,这是我能发现的唯一区别。

于 2016-03-01T15:10:49.180 回答
0

我也遇到过这种情况。

经过一些测试后,似乎当释放“选择”按钮时,tvOS 调用pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?) OR pressesCancelled(_ presses: Set<UIPress>, with event: UIPressesEvent?)

至于为什么会这样,我不知道。在每次按下按钮之间我没有做任何不同的事情。可能是 tvOS 中的错误。

我通过跳转到定义pressesEnded(_ presses: Set<UIPress>, with event: UIPressesEvent?)并找到以下评论找到了这个解决方案:

您的响应者将收到 pressesEnded:withEvent 或 pressesCancelled:withEvent: 对于它正在处理的每次按下(在 pressesBegan:withEvent: 中接收到的那些按下)。

这是我就同一问题提出的问题的链接。

于 2017-11-15T14:50:53.293 回答