【问题标题】:VoiceOver Z gesture won't trigger when UIAlertController is active当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发
【发布时间】:2018-08-08 21:07:55
【问题描述】:

我正在尝试使用 Z 手势来关闭 UIAlertController。我有一个非常简单的应用程序。它有一个带有 1 个按钮的视图。点击按钮会显示警报。我已经实现了

- (BOOL)accessibilityPerformEscape {
    NSLog(@"Z gesture");
    return YES;
}

在 VoiceOver 开启的情况下,擦洗屏幕会打印出“Z 手势”,但是当我按下按钮并且警报可见时,擦洗屏幕什么也不做,不会调用该方法,也不会打印任何内容。当警报显示在屏幕上时,我需要做什么才能使其正常工作?

谢谢...

【问题讨论】:

  • 这个GitHub thread 可能会有所帮助。看起来您需要在自定义视图控制器本身中实现可访问性委托方法 - 在这种情况下可能是 UIAlertController 实例。

标签: ios objective-c uialertcontroller voiceover uiaccessibility


【解决方案1】:

要通过擦洗手势在警报视图上获得所需的结果,请在警报视图本身中覆盖 accessibilityPerformEscape()

一种解决方案可能是在 UIView 扩展中实现此覆盖,如下所示:

extension UIView {

override open func accessibilityPerformEscape() -> Bool {

    if let myViewController = self.findMyViewController() as? UIAlertController {

        myViewController.dismiss(animated: true,
                                 completion: nil)
    }
    return true
}


private func findMyViewController() -> UIViewController? {

    if let nextResponder = self.next as? UIViewController {
        return nextResponder
    } else if let nextResponder = self.next as? UIView {
        return nextResponder.findMyViewController()
    } else {
        return nil
    }
}

}

代码足够短,无需进一步解释即可理解。如果不清楚,请不要犹豫。

函数findMyViewController已找到here

【讨论】:

  • 在不修改 UIView 的情况下,有没有办法将手势处理程序附加到警报?
  • @GrantNeufeld:这只是我觉得有趣的一个实现示例。我认为您也可以在您创建的“UIAlertController”子类中覆盖“accessibilityPerformEscape”。
  • 有趣的是,这需要为标准 UIAlertController 覆盖。 Apple 的文档说:“解除警报或返回上一个屏幕:两指擦洗(快速来回移动两根手指三遍,形成一个“z”)”但他们忽略了提供默认实现? support.apple.com/en-kz/guide/iphone/iph3e2e2281/ios
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多