如何在出现覆盖时禁用 main UI?
How to disable main UI when overlay appears?
我构建了一个如下所示的流式音频应用程序:
当流丢失时,我覆盖这个屏幕:
我的问题是,在启用画外音的情况下,所有底层控件仍然处于活动状态:我可以向它们滑动,并调整它们的值。
这是我在信号丢失和恢复时的代码片段:
@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 以便只有叠加响应任何与画外音相关的操作?
在 UIAccessibility
个元素(例如视图)上,有一个名为 accessibilityElementsHidden
的 属性。将此值设置为 true
应该隐藏被 "reconnecting" 视图覆盖的视图。
考虑在后台 UITableView
上将 this 值设置为 true。
有关详细信息,请查看文档:https://developer.apple.com/documentation/objectivec/nsobject/1615080-accessibilityelementshidden
好的!我已经成功了。除了将 '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
)
}
}
我构建了一个如下所示的流式音频应用程序:
当流丢失时,我覆盖这个屏幕:
我的问题是,在启用画外音的情况下,所有底层控件仍然处于活动状态:我可以向它们滑动,并调整它们的值。
这是我在信号丢失和恢复时的代码片段:
@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 以便只有叠加响应任何与画外音相关的操作?
在 UIAccessibility
个元素(例如视图)上,有一个名为 accessibilityElementsHidden
的 属性。将此值设置为 true
应该隐藏被 "reconnecting" 视图覆盖的视图。
考虑在后台 UITableView
上将 this 值设置为 true。
有关详细信息,请查看文档:https://developer.apple.com/documentation/objectivec/nsobject/1615080-accessibilityelementshidden
好的!我已经成功了。除了将 '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
)
}
}