当聚焦非 UILabel titleView 时,VoiceOver 会读取辅助功能标签两次

2024-05-22

我在使用 VoiceOver 时遇到了一个奇怪的问题。

Goals:

  • Set a UIStackView含有多个UILabel就如我的navigationItem.titleView.
  • 将堆栈视图标记为辅助功能元素并设置其accessibilityLabel到一个合适的值。
  • 通过调用将堆栈视图设置为初始 VoiceOver 焦点UIAccessibility.post(notification: .screenChanged, argument: navigationItem.titleView) inside viewDidAppear(animated:).

预期结果:

  • 当视图控制器出现时,焦点似乎位于标题视图上,并且 VoiceOver 会读取一次辅助功能标签的内容。

实际结果:

  • VoiceOver 开始读取辅助功能标签的内容,然后中途(或有时完成后)继续第二次读取。

如果我设置就不会出现这个问题navigationItem.titleView到一个实例UILabel.

有谁知道为什么会发生这种情况?这是 iOS 中的一个错误吗?

我在这里建立了一个简单的项目来演示这个问题:https://github.com/rzulkoski/Focus-TitleView-Bug https://github.com/rzulkoski/Focus-TitleView-Bug


您第二次阅读标题的原因在于您的代码中。

In your viewDidLoad,您可以设置 VoiceOver 自动读出的 stackview 辅助功能标签,以通知用户所做的更改。

接下来,您通过在您的帖子中通知此更改viewDidAppearVoiceOver 也会自然地读出。

要防止这种行为,只需删除stackView.accessibilityLabel = label.text在你的setupNavigationItem函数并将此代码片段添加到您的私有惰性 var 标签 init 中:

if (self.view.subviews.contains(stackView)) {
        stackView.accessibilityLabel = label.text
}

更新中stackView.accessibilityLabel这种方式不会触发 VoiceOver 来通知用户并允许您了解您的目的。

但是,我不建议将标题读出为新页面的第一个元素,除非您reorder http://a11y-guidelines.orange.com/mobile_EN/dev-ios.html#reading-order所呈现的元素。

VoiceOver 用户自然不会猜测标题之前存在另一个元素:

  • 他们可能找不到返回上一页的方法。
  • 如果他们使用 a 获取页面的第一个元素,他们可能会丢失4个手指简单点击 http://a11y-guidelines.orange.com/mobile_EN/voiceover.html#PageFirstElement因为他们会得到后退按钮而不是标题。

从技术上来说,您的问题已通过上面的代码解决但是,从概念上讲,如果您仍然想将标题公开为第一个元素,我建议对元素重新排序。

=========

编辑(解决方法)

关于技术问题,您的评论是正确的,由于 VoiceOver 的标签读取,上述解决方案才有效。

我在你的第一篇文章中的 git 分支中提交了一个解决方案。

问题涉及 UIStackView 在这种情况下我无法解释,也无法按原样解决。

为了达到你的目的,我创建了一个UIAccessibilityELement对于可以完美到达和暴露的堆栈视图,无需使用后通知进行双重读取。

我这样做是因为当标签位于...时我无法以编程方式获取 stackview 新大小...也许创建一个 UIStackView 子类并进入其layoutSubviews可能是窍门?

该解决方案应该作为解决方法但我不知道为什么 UIStackview 会出现这种行为。

=========

编辑(解决方案)

问题是方法titleView of the navigationItem被建造。实现您的目的的最佳方法是:

  • 将您的 titleView 初始化为一个简单的UIView其框架与 stackview 的框架相同。
  • 指定其框架及其辅助功能后,将 stackview 添加为子视图。

请在您的代码中执行以下步骤:

  • Add the .headerstackview 属性中的特征:

    private lazy var stackView: UIStackView = {
        let stackView = UIStackView(frame: .zero)
        stackView.axis = .vertical
        stackView.alignment = .center
        stackView.distribution = .equalSpacing
        stackView.isAccessibilityElement = true
        stackView.accessibilityTraits = .header
        return stackView
    }()
    
  • 更改“switch...case...”代码部分中的 stackview 大小写,如下所示:

    case .stackView:
        label.text = "UIStackView"
        label.sizeToFit()
        stackView.addArrangedSubview(label)
    
        label2.text = subtitle
        label2.sizeToFit()
        stackView.addArrangedSubview(label2)
    
        stackView.frame.size.width = max(label.frame.width, label2.frame.width)
        stackView.frame.size.height = label.frame.height + label2.frame.height
    
        stackView.accessibilityLabel = label.text?.appending(", \(label2.text!)")
    
        navigationItem.titleView = UIView(frame: stackView.frame)
        navigationItem.titleView?.addSubview(stackView)
    }
    

现在postNotification 仅读出一次 stackview作为屏幕的第一个元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当聚焦非 UILabel titleView 时,VoiceOver 会读取辅助功能标签两次 的相关文章

  • 是否可以在 UITabBarController 内显示 SFSafariViewController?

    我要加载SFSafariViewController位于选项卡内部 因此选项卡栏位于整个 Safari 视图的底部 这可能吗 我尝试了这个但没有运气 self tabBarController presentViewController s
  • iphone / css - 单击时如何防止项目上出现黑色半透明覆盖

    我正在编写一个移动网站 在 iPhone 中 当您触摸 按住可点击项目时 图像顶部会出现明显的半透明黑色覆盖层 有人经历过这个吗 我该如何摆脱它 有没有办法用css 这是我的代码 childLink div class option div
  • 从 WatchKit 中的模态视图传回数据

    当模态呈现或推送界面控制器时 我们可以指定context参数将一些数据传递给新控制器 如下所示 Push self pushControllerWithName MyController context NSDictionary dicti
  • 在 IOS 上检查 Facebook Connect 会话

    在新的 Facebook 库中 FBSession 对象消失了 当用户启动应用程序时 如何在不提示 safari 或 uiwebview 的情况下立即检查用户的设备上是否有有效会话 facebook isSessionValid 方法适用于
  • 致命错误:找不到“Fabric/Fabric.h”文件

    我正在使用 xcode 6 3 1 OSX 10 10 3 并且我已经在本地系统上成功配置了 crashlytics 它工作正常 并通过 Fabric 应用程序发布构建 但是当我将相同的代码库转移到 teamcity 时 它向我显示以下错误
  • 解决听写/自定义文本视图错误

    我有一个实现的视图UIKeyInput并覆盖shouldBecomeFirstResponder回来YES 点击此视图时 键盘会弹出 如果用户点击听写按钮 按下 完成 然后尝试关闭键盘 应用程序将崩溃并显示 Fatal Exception
  • NSAttributedString '\n' 被忽略

    我有一个视图 其唯一的 UI 元素是UITextView In viewDidLoad 我使用 Text n 创建一个属性字符串 并将文本视图的属性文本设置为 NSAttributedString string NSAttributedSt
  • 快速转换:错误 - CGPathAddArc

    我正在尝试将我的 Swift 2 代码转换为最新语法 Swift 3 我收到以下错误 Nil 与预期的参数类型 UnsafePointer 不兼容 斯威夫特2代码 CGPathAddArc 路径 nil overlayView frame
  • ios - navigationItem.titleView 更新时闪烁

    我有一个UIView 拿着一个UIButton 设置为我的navigationItem titleView 当我更新此按钮的文本时 它会短暂闪烁 消失并随新文本重新出现 无论如何 当它改变时 是否可以保持它可见 那么 如果我更改 2015
  • 在堆栈视图内的 Uilabel 之间创建垂直线 [重复]

    这个问题在这里已经有答案了 我想在代码中创建一个带有自定义标头的 UICollectionView 因此 我创建了 UICollectionViewCell 的子类来描述我的自定义标头 我想在标题中以水平线显示五个标签 因此 我创建了五个标
  • UIWebView didFinishLoading 多次触发

    我有一些代码需要在 a 之后运行UIWebView完成加载文档 为此我设置了UIWebView的委托给我的控制器 并实现了webViewDidFinishLoading method 这会被多次调用 具体取决于要加载的页面类型 我不确定是否
  • iOS:如何使用 CGLayer 支持 Retina 显示屏?

    我正在 CALayer 的委托方法中绘制图表drawLayer inContext 现在我想支持 Retina Display 因为图形在最新设备上看起来很模糊 对于直接在 CALayer 传递的图形上下文上绘制的部分 我可以通过如下设置
  • scrollViewDidScroll:在 UITableViewRowAnimation 上?

    当一个人使用一个UITableViewRowAnimation删除一行或添加一行时 有时如果该行位于表视图的最末端 则表会滚动 然而 即使它滚动它似乎并没有调用scrollViewDidScroll 关于代表 例如 我的委托中有以下代码 v
  • 如何在首选项包中使用 PSLinkListCell 中的值?

    我想为我的越狱调整制作一个偏好包 我成功地制作了一个带有可用开关的首选项捆绑包 但我想要一个选择颜色的设置 例子 Blue Color gt Yellow Green 所以如果我点击Color 它会将我带到另一个屏幕 要求我选择 Blue
  • Swift 3:将 UIButton 扩展添加到 ViewController

    我是 iOS Swift 的初学者 尝试创建一个没有 Storyboard 的简单应用程序 我创建了一个UIButton扩展名 我想在我的视图中添加一个简单的按钮 稍后将设置约束 不幸的是 该按钮不可见 如果有人帮助我 我将不胜感激 谢谢你
  • 检测 AVPlayerViewController 是否正在播放视频或正在缓冲并向播放器添加覆盖

    我必须检测视频是否处于播放模式或缓冲模式 我正在从 URL 加载视频 我已经尝试了下面的代码 我可以在视频开始播放后进行跟踪 但不能在视频处于缓冲状态时进行跟踪 另外 我想在我的播放器中添加覆盖视图 我尝试在 AVPlayer 中添加叠加层
  • FileManager 说文件不存在

    我有一个用例需要UIImage保存到文档目录 然后UIImage需要转换为PDF并保存到文档目录 转换为 PDF 的代码 var filePath NSString string self selectedMedia imagePath i
  • object_setClass()而不是分配isa指针的性能

    我注意到在 XCode 4 6 的最新更新中 我收到了关于以下几行的警告JSONKit m 具体来说 设置对象类的行 dictionary gt isa JKDictionaryClass 这些被标记为已弃用 并注明首选方法是使用objec
  • 外围 BLE 设备的唯一标识符

    所以我有外围设备BLE设备 我需要一些标识符以便稍后与另一部 iPhone 共享 我连接的示例iPhone A 为外围设备 iPhone A 将外围设备的标识符保存到数据库中 稍后我可以轻松获取iPhone B 并连接到通过该标识符找到的外
  • 记录使用 OpenAL 播放的样本

    我在 iOS 上使用 OpenAL 同时播放 9 个循环 为了使循环 100 同步 它们开始在不同的线程上运行 有关使用 OpenAL 记录正在播放的内容的任何指示 教程 如果我使用不同的线程 我会遇到录制问题吗 iOS 上的 OpenAL

随机推荐