Ios 辅助功能将焦点设置为导航栏标题项 概述:

Ios 辅助功能将焦点设置为导航栏标题项 概述:,ios,swift,uiaccessibility,Ios,Swift,Uiaccessibility,我想将可访问性焦点设置为导航栏的标题项 默认情况下,焦点从左上角设置,这意味着“后退”按钮将处于焦点位置 我希望标题项目是重点 迄今为止所作的努力: 问题: 上面的代码没有任何区别,后退按钮仍然处于焦点位置 可能原因: 无法获取与标题相对应的项目,无法设置焦点 解决方案1 我不喜欢它,但它是不依赖于挖掘隐藏子视图(UINavigationBar视图层次结构的内部实现)的最低黑客数量 首先在视图中,我存储了“后退”按钮项的备份引用, 然后移除后退按钮项(leftBarButtonItem):

我想将可访问性焦点设置为导航栏的标题项

默认情况下,焦点从左上角设置,这意味着“后退”按钮将处于焦点位置

我希望标题项目是重点

迄今为止所作的努力: 问题:
  • 上面的代码没有任何区别,后退按钮仍然处于焦点位置
可能原因:
  • 无法获取与标题相对应的项目,无法设置焦点

    • 解决方案1 我不喜欢它,但它是不依赖于挖掘隐藏子视图(UINavigationBar视图层次结构的内部实现)的最低黑客数量

      首先在视图中,我存储了“后退”按钮项的备份引用, 然后移除后退按钮项(leftBarButtonItem):

      然后,我恢复back项,但仅在我在viewdidappease()中调度screen changed事件之后:

      解决方案2: 禁用导航栏和视图控制器上的所有辅助功能,直到ViewDidDisplay()完成:

          self.navigationController.navigationBar.accessibilityElementsHidden = true
          self.view.accessibilityElementsHidden = true
      
      ,然后在ViewDid中手动将布局元素可访问性为焦点的事件分派到UINavigationBar的标签子视图:

      UIAccessibilityPostNotification( UIAccessibilityLayoutChangedNotification, self.navigationController.navigationBar.subviews[2].subviews[1])   
      //  The label buried inside the nav bar.   Not tested on all iOS versions.  
      // Alternately you can go digging for the label by checking class types. 
      // Then use DispatchAsync, to re-enable accessibility on the view and nav bar again... 
      
      我也不喜欢这种方法


      ViewDid中的DispatchAsync延迟似乎在任何情况下都是必要的——我认为这两种解决方案仍然很糟糕

      首先,我们需要创建一个有用的扩展:

      扩展UIViewController{ func setAccessibilityFocus(视图中:UIView){ UIAccessibility.post(通知:。屏幕已更改,参数:视图) } } 然后,我们可以在导航栏标题中设置焦点,如下所示:

      setAccessibilityFocus(位于:self.navigationController!.navigationBar.subviews[2]。subviews[1])
      
      相同的问题和类似的尝试都没有成功:UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,self.navigationController?.navigationBar.topItem)。还尝试在ViewDidDisplay中添加延迟-没有任何区别。注意,即使是苹果的应用程序(如Contacts)也会先按“后退”按钮,然后再按标题。实际上,我喜欢第二个选项,您是否可以编辑您的答案,添加两个标题(降价)作为“选项1”和“选项2”。了解你的答案中有两个选项可能会有所帮助
      override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(animated)
      
          UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil)
          DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { [weak self] in
              self?.navigationItem.leftBarButtonItem = self?.backButtonBackup
          }
      }
      
          self.navigationController.navigationBar.accessibilityElementsHidden = true
          self.view.accessibilityElementsHidden = true
      
      UIAccessibilityPostNotification( UIAccessibilityLayoutChangedNotification, self.navigationController.navigationBar.subviews[2].subviews[1])   
      //  The label buried inside the nav bar.   Not tested on all iOS versions.  
      // Alternately you can go digging for the label by checking class types. 
      // Then use DispatchAsync, to re-enable accessibility on the view and nav bar again...