[英]swift-ios- Accessibility - change Voiceover read/focus order to content view first then the navigation items?
我正在设计一个启用了辅助功能的应用程序。 我在navigationBar
上有一个rightBarButtonItem
,中间有几个标签,底部有一个按钮。
我想实现以下行为:每次加载当前视图时,VoiceOver 焦点将:
为了确保这样的顺序,我在viewController
中进行了编码
navigationController?.view.accessibilityElements = [label1, label2, button, navigationItem.rightBarButtonItem]
它确实确保了读取顺序,但焦点顺序在 rightBarButtonItem 处失败。 无法点击。
如何解决这个问题呢?
每次加载当前视图时,请使用UIAccessibilityPostNotification方法来达到目的。
更改通知有多种类型,但是UIAccessibilityScreenChangedNotification可能是您感兴趣的一种。
它通知整个页面已更改,包括nil
或UIObject
作为传入参数:
nil
,页面中的第一个可访问元素将获得焦点。 UIObject
, 焦点将转移到指定的元素 。 该通知伴随着发声,包括宣布新页面的声音。
编辑
我误解了您的问题,这个问题比我想象的要复杂得多。
如果要影响导航栏项目,则应使本机项目不可访问,并创建自己的自定义元素以订购和/或添加自定义动作。
让我们以带有标签,按钮和导航栏的示例为例,该导航栏包括一个右栏按钮(我不考虑潜在的后退按钮 )。
在您的视图控制器中执行以下步骤:
步骤1 :建立您的店铺。
@IBOutlet weak var myLabel: UILabel!
@IBOutlet weak var myButton: UIButton!
@IBOutlet weak var myRightBarItem: UIBarButtonItem!
第2步 :隐藏导航栏项目,以免听其发声。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationController!.navigationBar.accessibilityElementsHidden = true
}
步骤3 :为右栏按钮创建一个可访问元素。
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let rightButtonView = myRightBarItem.value(forKey: "view") as? UIView
let navigationBarView = rightButtonView?.superview?.superview?.superview
let newElt = UIAccessibilityElement(accessibilityContainer: self.view)
newElt.accessibilityFrameInContainerSpace = navigationBarView!.convert((rightButtonView?.superview!.frame)!,
to:self.view)
newElt.accessibilityLabel = "new navigation right bar button"
newElt.accessibilityTraits = .button
//Order your elements as you wish.
self.view.accessibilityElements = [myLabel,
myButton,
newElt]
}
最后一步是根据您的应用目的,在右侧栏按钮中添加一个或多个操作。
完成后,您可以使用此方法进行自定义,并先按顺序阅读/关注内容视图,然后再按问题中所述导航项。
可以优化此解决方案,但可以实现您的目标。
您可以添加 function 作为 UIAccessibility 扩展,以便在加载屏幕时将焦点设置在任何项目上,然后执行 accessibilityElements
extension UIAccessibility {
static func setFocusTo(_ object: Any?) {
if UIAccessibility.isVoiceOverRunning {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.8) {
UIAccessibility.post(notification: .layoutChanged, argument: object)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.