如何在叠加出现时禁用主UI?

时间:2018-02-28 16:57:07

标签: ios swift uiview voiceover subviews

我已经构建了一个如下所示的流式音频应用:

enter image description here

当流丢失时,我覆盖了这个屏幕:

enter image description here

我的问题是,在Voiceover ON的情况下,所有底层控件仍处于活动状态:我可以向它们全部滑动,并调整它们的值。

以下是我的代码片段,用于表示信号丢失并重新获得的信息:

@objc func lostStream() {
    DispatchQueue.main.async {
        self.lossOfSignalBlocker.alpha = 0.0
        self.lossOfSignalBlocker.frame = self.view.bounds
        self.view.addSubview(self.lossOfSignalBlocker)
        self.lossOfSignalBlocker.isUserInteractionEnabled = true
        //UIView.animate(withDuration: 0.2) { self.lossOfSignalBlocker.alpha = 1.0 }
        UIView.animate( withDuration: 0.2, animations: { self.lossOfSignalBlocker.alpha = 1.0 } )

        //Announce loss of signal to Voiceover user.
        UIAccessibilityPostNotification(
            UIAccessibilityAnnouncementNotification,
            "Signal Lost" as NSString
        )
    }
}

@objc func regainedStream() {
    DispatchQueue.main.async {
        UIView.animate( withDuration: 0.2, animations: { self.lossOfSignalBlocker.alpha = 0.0 } )
        { _ in
            self.lossOfSignalBlocker.removeFromSuperview()
        }
    }
}

如何禁用主用户界面,以便只有叠加层可以响应任何与画外音相关的操作?

2 个答案:

答案 0 :(得分:1)

UIAccessibility元素(例如视图)上,有一个名为accessibilityElementsHidden的属性。将此值设置为true应该隐藏“重新连接”视图到达所涵盖的视图。

考虑在后台UITableView时将此值设置为true。

有关详细信息,请查看文档:{​​{3}}

答案 1 :(得分:1)

OK!我已经成功了。除了设置' accessibilityElementsHidden'为TRUE,您必须通过调用“UIAccessibilityPostNotification”来告诉应用程序屏幕已更改。使用&UUCccessibilityScreenChangedNotification'通知。

这里的代码现在是什么样的:

@objc func lostStream() {
    DispatchQueue.main.async {

        self.lossOfSignalBlocker.alpha = 0.0
        self.lossOfSignalBlocker.frame = self.view.bounds
        self.view.addSubview(self.lossOfSignalBlocker)
        self.lossOfSignalBlocker.isUserInteractionEnabled = true
        UIView.animate( withDuration: 0.1, animations: { self.lossOfSignalBlocker.alpha = 1.0 } )

        //Disable Voiceover accessibility controls in main view
        self.tableView.accessibilityElementsHidden = true

        //Notify app the screen has changed.
        UIAccessibilityPostNotification(
            UIAccessibilityScreenChangedNotification,
            nil
        )

        //Announce loss of signal to Voiceover user.
        UIAccessibilityPostNotification(
            UIAccessibilityAnnouncementNotification,
            "Signal Lost. Reconnecting." as NSString
        )

    }
}

@objc func regainedStream() {
    DispatchQueue.main.async {

        UIView.animate( withDuration: 0.2, animations: { self.lossOfSignalBlocker.alpha = 0.0 } )
        { _ in
            self.lossOfSignalBlocker.removeFromSuperview()
        }

        //Re-enable Voiceover accessibility controls in main view
        self.tableView.accessibilityElementsHidden = false

        //Notify app the screen has changed.
        UIAccessibilityPostNotification(
            UIAccessibilityScreenChangedNotification,
            nil
        )

        //Announce signal regained to Voiceover user.
        UIAccessibilityPostNotification(
            UIAccessibilityAnnouncementNotification,
            "Reconnected." as NSString
        )

    }
}