如何创建 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 0
和 max 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.
}
}
我在 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 0
和 max 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.
}
}