首页 > 解决方案 > iOS UISlider VoiceOver 禁用说值

问题描述

我有一个UISlider可以在音乐中寻找的东西。

客户要求不公布此滑块的值更改VoiceOver

现在 VoiceOver 的默认行为UISlider是宣布百分比值并降低该时间的音乐音量。这对我不好。

如果我将 更改accessibilityValue@"",那么它会产生声音效果并降低音乐音量。这也很糟糕。

我尝试使用UIAccessibilityTraitStartsMediaSessionUIAccessibilityTraitPlaysSound可访问性特征,但它们不会影响这种行为。

我应该怎么办?

标签: iosaccessibilityuislidervoiceoveraudio-player

解决方案


使用本机UISlider是一种非常好的做法,但不适用于您的特定用例,因为当它的值发生变化时,您将始终拥有您注意到的声音效果。

我建议在空白项目中创建自定义可访问性元素,如下所示:

  • 首先,在 Xcode 界面构建器中创建滑块,并使用与视图控制器的插座连接。
  • 实现一个UIAccessibilityElement代表您的滑块的子类。

    class a11yMySlider: UIAccessibilityElement {
    
        var minimumValue = 0.0
        var maximumValue = 10.0
        var value = 5.0
        var theSlider = UISlider()
    
        init(in container: Any, with slider: UISlider) {
            super.init(accessibilityContainer: container)
            theSlider = slider
        }
    
        override var accessibilityTraits: UIAccessibilityTraits {
            get { return UIAccessibilityTraitAdjustable }
            set {  }
        }
    
        override func accessibilityDecrement() {
            value -= (value == minimumValue) ? 0.0 : 1.0
            theSlider.value = Float(value)
        }
    
        override func accessibilityIncrement() {
            value += (value == maximumValue) ? 0.0 : 1.0
            theSlider.value = Float(value)
        }
    }
    
  • 在视图控制器中引入辅助功能元素以使用 VoiceOver 模拟物理滑块。

    class SliderNoSoundViewController: UIViewController {
    
        @IBOutlet weak var mySlider: MySlider!
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
    
            let a11yElt = a11yMySlider.init(in: self.view, with: mySlider)
    
            a11yElt.accessibilityFrame = mySlider.frame
            self.view.accessibilityElements = [a11yElt]
        }
    }
    

我让您调整传入的参数以及与项目内音乐播放的连接,但实际上,VoiceOver 不会根据需要发声滑块值的变化

此外,如果您需要更多信息来完成 VoiceOver 的实施,还可以使用插图和代码片段 (ObjC 和 Swift) 。


推荐阅读