【问题标题】:tvos: UIViewController does not receive touchesBegantvos:UIViewController 没有收到 touchesBegan
【发布时间】:2016-03-26 16:07:21
【问题描述】:

我正在尝试为 Apple tv4 (tvos) 编写应用程序。当我的应用程序启动时,视图控制器确实收到了touchesBegan 事件,因为它应该。

在不涉及太多细节的情况下,应用程序创建、移动和删除子视图以响应用户的交互。

一段时间后,视图控制器不再收到touchesBegan(这是我正在尝试调试的奇怪错误)。

由于我认为问题与响应者链有关,我做了以下两个实验:

  1. 如果我让视图控制器覆盖并从canBecomeFirstResponder 返回true,那么问题仍然存在,但发生的频率要低得多。
  2. 如果我不重写该函数而是检查谁是第一响应者,那么我发现应用程序没有第一响应者,即使在奇怪的错误发生之前也是如此。也就是说,即使应用正常,App也没有第一响应者!

问题: 什么可以阻止touchesBegan 被调用?是否与响应者更改有关?如果是,请解释上面的2。

【问题讨论】:

  • 对不起..我可能听错了...重新阅读后,您是说使用一段时间后它就停止工作了?也许您可以提供更多关于您正在做什么的信息(包括代码示例),以便我们更好地了解正在发生的事情。
  • 您是否可能添加了UIButtons 或其他启用焦点引擎的元素,从而禁用了常规触摸事件?

标签: swift tvos touchesbegan first-responder


【解决方案1】:

您应该如何“触摸”在非触摸屏电视上呈现的视图?

您不是……tvOS 不像 iOS 那样工作,因为您无法检测到触摸,因为 Apple TV 不支持启用触摸屏的输入设备。

相反,您使用UIFocusEngine 来处理与视图层次结构中呈现的内容的交互。

查看 Apple 开发人员库中的“Controlling the User Interface with the Apple TV Remote”了解更多信息。

【讨论】:

  • 好吧,我可以触摸 Siri Remote(或在模拟器中按 alt 键)。此外,我可以使用手势识别器来检测滑动。一切正常,直到发生错误。可能与焦点/或第一响应者有关。
  • Siri Remote 上的操作无法映射到UIView 内的坐标。 UIControl 和 UIGestureRecognizer 等高级 API 已更新以支持这种跨平台(稍作调整),但是像 UITouch 这样的低级 API 不存在只是因为它无法翻译。查看上面链接中的下一部分(检测手势和按钮按下),因为它解释了这一切。从技术上讲,您可以考虑使用 pressesBegan:、pressesChanged: 等,但它不会直接替代触摸等效项
  • 我不关心绝对坐标。我想知道用户何时滑动,以及她向哪个方向滑动。 pressesBegan 总是被调用,没问题,但我也喜欢捕捉滑动。
  • 您不必关心,UITouch 会关心,因此它不会被调用。也许看看使用UIGestureRecognizer 来代替。
  • 无益的答案。确实,对于常见的 UI 交互,焦点引擎很好。但是在视图控制器上使用touches... 和presses... 函数来评估触摸事件以进行高级自定义触摸处理是100% 有效的。 FWIW,我偶尔会观察到同样的行为,即使它会继续接收新闻事件,它也不会接收到触摸事件。感觉就像 tvOS 的一个错误。
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多