SwiftUI Slider 使用 VoiceOver 不解释双击

Posted

技术标签:

【中文标题】SwiftUI Slider 使用 VoiceOver 不解释双击【英文标题】:SwiftUI Slider using VoiceOver not interpreting double tap 【发布时间】:2021-12-30 14:45:58 【问题描述】:

我正在使用 SwiftUI 构建 Slider 元素,并尝试使用双击手势将其值设置回默认值。这在非 VoiceOver 模式下工作正常。

根据苹果 (here) 的说法,在 VoiceOver 中,双击是使用三次敲击完成的。 (参见Take action on an item 部分)。但是,当我在 VoiceOver 模式下选择 Slider 并轻按三次时,我会听到三个提示“没有发生任何事情”的提示音,并且不会触发我的回调。

我的代码如下:

import SwiftUI

struct ContentView: View 

  @State var value: Float = 0.5

  var body: some View 
    VStack 
      Slider(value: self.$value, in: 0...1)
        .contentShape(Rectangle())
        .border(Color.red)
        .onTapGesture(count: 2, perform: 
          print ("Setting to default!")
          self.value = 0.5
        )
    
  

我已尝试添加可访问性 traits(至少,可能对我有意义的那些,例如 allowsDirectInteraction),但似乎没有任何东西可以实现这一点 - 我错过了什么吗?

【问题讨论】:

我的回答是否为您最初的问题提供了适当的答案? ??? (希望你恢复得很好????) 【参考方案1】:

"...当我在 VoiceOver 模式下选择滑块并轻按三次时,我会听到三个表示“什么都没有发生”的提示音...

如果没有为特定手势在所选项目上定义任何操作,VoiceOver 会提示您“没有发生任何事情”,这是正常的。 ?

“……我的回调没有被触发。”

手势识别器很棒,但它仅为 UI 设计,不适用于 VoiceOver.⚠️ 当您在VoiceOver ON 状态下触摸屏幕时,屏幕阅读器会分析手势并与相应的动作进行一种映射。 它看起来像你的 UI 上方的布局,它通过它的定义读取你的手势,这就是为什么手势识别器在这种情况下不起作用的原因......无论在屏幕上点击 2、3 或更多:没有检测到,因为没有被解释为UI交互。?

为了达到这个目标,您为滑块插入特征 .allowsDirectInteraction 的想法很棒?。 为此,您必须通过转子激活direct touch,然后直接触摸它所属的项目(您的情况下的滑块:请注意,触摸拇指无效,只有轨道对这个元素有好处,我不知道为什么?) ⟹如果你在项目框架之外触摸,它不会被检测到。 ⚠️ 为了您的记录,这个特征在元素的框架内创建了一个区域,VoiceOer 不会在其中进行映射,只有常见的 UI 手势是已知的,这就是识别器在这种情况下工作的原因。

目前(ios 15),可以通过实现其accessibilityActivate专用功能来创建自己的可访问性元素并定义其激活时的操作,该功能将在单指触发时触发发生双击。

但是,据我所知,您提到的用一根手指连按三次无法定义或覆盖:它可能仅适用于具有自己操作的 Apple 项目(开发人员禁止使用黑框?)。

【讨论】:

以上是关于SwiftUI Slider 使用 VoiceOver 不解释双击的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI脑洞大开打造实时显示当前值的Slider(滑动器)

SwiftUI Slider 使用 VoiceOver 不解释双击

如何在 SwiftUI 中自定义 Slider 蓝线?

单个 Slider 的 Swiftui 多重绑定

13:SwiftUI-slider滑块

SwiftUI:Slider 在导航栏项目的前导/尾随时的奇怪行为