当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发

Posted

技术标签:

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

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

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

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

谢谢...

【问题讨论】:

这个GitHub thread 可能会有所帮助。看起来您需要在自定义视图控制器本身中实现可访问性委托方法 - 在这种情况下可能是 UIAlertController 实例。 【参考方案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

以上是关于当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发的主要内容,如果未能解决你的问题,请参考以下文章

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

搜索栏处于活动状态时,状态栏图标变为黑色

显示没有按钮的 UIAlertController 时 UI 测试失败

Swift 如何获取 UIAlertController 标题高度

呈现的 UIViewController 不能呈现 UIAlertController

当且仅当区域在 Emacs 中处于活动状态时,标记是不是处于活动状态?