微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在“UIApplication”或“UIWindow”级别检测 VoiceOver 焦点变化/用户交互?

如何解决有没有办法在“UIApplication”或“UIWindow”级别检测 VoiceOver 焦点变化/用户交互?

我正在开发的应用的其中一项功能是“空闲超时”——基本上,如果用户没有与应用交互的时间超过五分钟,他们的会话会出于隐私/安全原因而结束。>

目前这是通过覆盖应用委托中的 sendEvent(_ event: UIEvent) 并重置计时器来实现的。

但是,我注意到当用户使用 VoiceOver 与应用交互时,根本不会调用 sendEvent(_ event: UIEvent)

用户双击以激活控件时调用,但它不是调用焦点更改,与 .adjustable 控件交互,等等。

这意味着,例如,如果用户在表格视图中的一长串行列表中滑动,则不会调用 sendEvent(_ event: UIEvent),并且用户可能会超时使用应用程序,即使他们已与其互动。

有没有办法检测 UIApplicationUIWindow 级别的 VoiceOver 焦点更改或交互,或者可以订阅以获得干净解决方案的通知

我找到的最接近的解决方案建议在单个视图上使用 UIAccessibilityFocus 协议,但这感觉起来可能非常混乱并且涉及很多子类化 (https://stackoverflow.com/a/20712889)。

对于适用于 VoiceOver 和非 VoiceOver 用户的空闲超时的任何不同建议也将不胜感激 - 我很可能错过了一些东西。

解决方法

所以我在这里找到了解决方案,现在我开始自责了。

UIAccessibility.elementFocusedNotification 是键 (https://developer.apple.com/documentation/uikit/uiaccessibility/1620210-elementfocusednotification)。

因此,解决方案可能类似于:

NotificationCenter.default.addObserver(self,selector: #selector(self.accessibilityElementFocussed(notification:)),name: UIAccessibility.elementFocusedNotification,object: nil)

@objc private func accessibilityElementFocussed(notification: NSNotification) {
    // Reset your idle timer here.
}

希望这对某人有所帮助 - 我在网上看到了很多不考虑 VoiceOver 用户的空闲计时器解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。