如何创建 left/right 音频平衡滑块并让画外音读出自定义值?

How to create a left/right audio balance slider and have Voiceover read out custom values?

我在 Interface Builder 中创建了一个 UISlider,并想用它来调整 L/R 两个通道之间的音频音量平衡。这就是现在的样子:  我目前的代码如下:

import UIKit

class StreamBalanceTableViewCell: AudioStreamTableViewCell {
static let identifier = "StreamBalanceTableViewCell"

override func awakeFromNib() {
    super.awakeFromNib()

    self.slider.minimumTrackTintColor = .gray
    self.slider.maximumTrackTintColor = .gray
}

@IBOutlet var slider: UISlider!
override func updateUI() {
    self.slider.value = self.audioInterface?.balance ?? 0.0
    self.slider.isEnabled = !(self.audioInterface?.muted ?? true)
}


@IBAction func sliderChanged(_ slider: UISlider) {
    self.audioInterface?.balance = slider.value
}

}

在 Interface Builder 中,我将滑块值设置为 0,将最小值设置为 -1,将最大值设置为 1,并设置 'User Interaction Enabled'、'Adjustable' 和 'Allows Direct Interaction' 特征.但是当我打开 Voiceover 时,我会以 10% 的增量报告值,从“50%”开始。

我希望滑块的行为与“常规”>“辅助功能设置”屏幕中此视图中的行为相同:

在这个位置,画外音显示:“左 30%,右 70%”

我如何完成我所追求的?

谢谢!!!

您可以设置 VoiceOver 使用视图属性说话的值(通过 NSObject):

  • .accessibilityLabel
  • .accessibilityHint
  • .accessibilityValue

VoiceOver 会在滑块移动时说出滑块的 .accessibilityValue

我将滑块设置为 min of 0max of 1 以便值以百分​​比表示,例如0.35 相当于 35%。然后我四舍五入到最接近的 10%,这样当滑块移动时,VoiceOver 会说出像 70% left 30% right 这样的值。

import UIKit

class ViewController: UIViewController {

    @IBOutlet var slider: UISlider!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        setSliderAccessibilityValue()           
    }

    @IBAction func sliderMoved(sender: Any?) {
        setSliderAccessibilityValue()    
    }

    func setSliderAccessibilityValue() {

        let right_percent = Int(
            round(slider.value * 10)  //=> round(0.2632 * 10) => round(2.632) => 3
        ) * 10  //=> 30
                                                //       30% = right %
        let left_percent = 100 - right_percent  //        |
                                                // left|..V......|right
                                                // balance: 70% left, 30% right
        let accValue = "\(left_percent)% left \(right_percent)% right"           
        slider.accessibilityValue = accValue

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}