【问题标题】:How to disable main UI when overlay appears?出现覆盖时如何禁用主用户界面?
【发布时间】:2018-08-08 15:25:18
【问题描述】:

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

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

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

这是我的代码的 sn-p,用于何时丢失和重新获得信号:

@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()
        }
    }
}

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

【问题讨论】:

    标签: ios swift uiview voiceover subviews


    【解决方案1】:

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

    考虑在后台将 UITableView 上的 this 值设置为 true。

    有关更多详细信息,请查看文档:https://developer.apple.com/documentation/objectivec/nsobject/1615080-accessibilityelementshidden

    【讨论】:

    • 谢谢!我设置了这个属性,并且仍然可以滑动到其他 tableView UI 元素,除非我点击屏幕,此时突出显示和访问主 UI 上的底层控件会消失。同样,当信号恢复且覆盖消失时,Voiceover 仍会说出我设置的覆盖文本,直到我再次点击屏幕以将焦点带回主 UI。如何在不额外点击屏幕的情况下将焦点转移到不同的视图?
    【解决方案2】:

    好的!我已经成功了。除了将“accessibilityElementsHidden”设置为 TRUE 之外,您还必须通过使用“UIAccessibilityScreenChangedNotification”通知调用“UIAccessibilityPostNotification”来告诉应用程序屏幕已更改。

    现在的代码如下所示:

    @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
            )
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2020-06-10
      • 2019-07-27
      • 2023-02-12
      相关资源
      最近更新 更多