У меня есть UISlider
, который может искать в музыке.
Клиент просит, чтобы изменение значения этого ползунка не объявлялось VoiceOver
.
Теперь по умолчанию VoiceOver для UISlider
объявляет процентное значение и снижает громкость музыки на это время. Это нехорошо для меня.
Если я изменю accessibilityValue
на @""
, это создаст звуковой эффект, а также уменьшит громкость музыки. Это тоже плохо.
Я пытался использовать черты доступности UIAccessibilityTraitStartsMediaSession
и UIAccessibilityTraitPlaysSound
, но они не влияют на это поведение.
Что я должен делать?
Ищите в музыке. Значение установки текущей позиции воспроизведения.
И вы хотите искать в музыке, используя настраиваемое свойство UISlider, без звука, верно?
Да. Вот так.
Использование нативного UISlider
— очень хорошая практика, но не в вашем конкретном случае, потому что у вас всегда будет звуковой эффект, который вы заметили при изменении его значения.
Я предлагаю создать настраиваемый элемент специальных возможностей в пустом проекте следующим образом:
Реализуйте подкласс 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.
Ваш код заставляет VoiceOver действительно молчать. Однако громкость музыки (играл мой AVPlayer) по-прежнему снижена. Кроме того, VoiceOver игнорирует все остальные подвиды контейнера.
@GyörgyBenedek: ваш вопрос касался только отключения вокализации VoiceOver при изменении значения ползунка. Это решение работает в пустом проекте, и вы можете интегрировать его в свою среду кодирования в соответствии со своими целями. Задайте другой вопрос своему игроку (очень специфичный)... и все подпредставления здесь игнорируются, потому что в данном случае они не реализованы в массиве self.view.accessibilityElements
.
Ладно, задам еще вопрос про плеер. Я включил все подвиды в массив accessibilityElements
, теперь все в порядке. Но есть еще одна вина. Я использую AutoLayout, и рамка UIAccessibilityElement
не соответствует рамке UISlider
. Пробовал [UIWindow convertRect:toWindow:]
, но бесполезно.
Что именно должен делать ваш слайдер с VoiceOver?