首页 > 解决方案 > 当 UIAlertController 处于活动状态时,VoiceOver Z 手势不会触发

问题描述

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

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

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

谢谢...

标签: iosobjective-cuialertcontrollervoiceoveruiaccessibility

解决方案


要通过擦洗手势在警报视图上获得所需的结果,请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已在此处找到。


推荐阅读