当聚焦非 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 会读取辅助功能标签两次 的相关文章

  • Swift:长按手势识别器 - 检测轻击和长按

    我想连接一个动作 如果手势是点击 它会以特定的方式为对象设置动画 但如果按下持续时间超过 0 5 秒 它会执行其他操作 现在 我刚刚连接了动画 我不知道如何区分长按和点击 如何访问新闻持续时间以实现上述目的 IBAction func ta
  • 在 WKWebView 中禁用缩放?

    有谁知道在 WKWebView 中禁用双击和捏缩放的简单方法 我尝试过的任何方法都不起作用 Webview scrollView allowsMagnification false Error value of type WKWebView
  • 当应用程序进入前台时,如何重新启动基于块的动画?

    我有以下基于块的动画 UIView animateWithDuration 0 5f delay 0 0f options UIViewAnimationOptionRepeat UIViewAnimationOptionAutorever
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 通过 Button Swift 中的标签发送行和部分

    我里面有这个cellForRowAtIndexPath cell plusBut tag indexPath row cell plusBut addTarget self action plusHit forControlEvents U
  • iOS:Facebook 登录访问令牌错误:由于模拟器错误,回退到从 NSUserDefaults 加载访问令牌

    根据说明进行配置后 我不断收到此错误 并且无法在我的应用程序上成功使用 Facebook 登录 我在 XCode 8 1 上运行它并使用 iOS 10 1 模拟器 我按照 Facebook iOS SDK 指南中的步骤操作 并将 Faceb
  • ios8 键盘高度有所不同

    我使用下面的代码来获取键盘高度 该高度在带有 ios8 的 iPhone 5s 设备中与带有 ios7 的 IPhone4s 设备中有所不同 因此 当我在带有 ios8 的 iPhone5s 中点击它时 我的文本字段移动得非常高 而相同的代
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • Unwind segue 的用途是什么以及如何使用它们?

    iOS 6 和 Xcode 4 5 有一个称为 Unwind Segue 的新功能 展开转场可以允许过渡到故事板中场景的现有实例 除了 Xcode 4 5 发行说明中的 这个简短条目之外 UIViewController 现在似乎还有几个新
  • 致命错误:在 Swift 中解包可选值时意外发现 nil

    所以我试图获取 Swift 中输入字段的文本 这就是我得到的 class ViewController UIViewController IBOutlet var passwordField UITextField IBOutlet var
  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • 具有图形样式的 DatePicker 打破了 iOS 16.0 上的布局限制

    以下代码在 iOS 16 0 的 Xcode 14 0 0 Beta 5 上运行时打破了布局约束 struct ContentView View State var date Date var body some View DatePick
  • WKWebView不加载https URL?

    我有一个 WKWebView 应该加载以下网址 https buchung salonmeister de place offer details page id 907599 venueId 301655 她是我使用的代码 import
  • 更改 UIImageView 的位置

    我怎样才能为 UIImageView 做一个简单的位置改变 假设当前坐标是 x 20 和 y 30 我想将其移至 x 100 和 y 100 可以制作运动动画吗 你需要改变它的CGFrameUIImageView就像这样 imageView
  • React-native iOS 不显示图像(pod 问题)

    我正在我的react native应用程序中安装一个包 具体来说 它是来自react navigation的createMaterialTopTabNavigator 但安装成功后 出现崩溃 错误 react navigation mate
  • 将更新的图像保存到 PhotoKit 时缺少图像元数据

    我在更新图像的元数据并将其保存回照片库时遇到问题 一切works除了更改后的图像元数据丢失了之前存在的条目 并且我在操作图像或执行照片库更改块时没有收到任何错误 另外 在写回图像之前的字典看起来就像原始字典加上我在调试器中的字典 我的问题是
  • 自定义 URL 方案不是 Outlook 中的链接 (iOS/Android)

    我们的应用程序可以使用自定义 URL 方案启动 例如myapp mainpage param 123 当它作为链接包含在网页中时 此功能有效 而且 在 iOS 上 它可以在平台附带的邮件客户端中运行 用户注册并安装该应用程序后 他会收到一封
  • 更改iOS11中的UISearchBar背景图片

    我想更改我的 UISearchBar 背景图像 当将它添加为我的 UITableView 中的标题视图时 它工作得很好 但是 当我想更改它以将 SearchBar 设置为 navigationItem 的 searchController
  • 动态图标 iOS [重复]

    这个问题在这里已经有答案了 可能的重复 每天更改图标 https stackoverflow com questions 4038305 changing icon per day 如何制作动态图标 例如在日历中 每天该数字都会更改为当前值
  • 反应本机套接字 io 没有从客户端发出事件

    尝试将socket io client与react native 现在是ios 一起使用 到目前为止 连接 从客户端接收服务器端事件似乎工作正常 但是我似乎无法从客户端发出任何事件 Client var socket io http loc

随机推荐