При переходе с одного экрана на другой фокус VoiceOver не сбрасывается на верхнюю часть нового экрана. Вместо этого он остается на ранее сфокусированном элементе или переходит в неожиданное положение (например, на батарею).
С точки зрения пользовательского опыта и доступности я ожидаю, что VoiceOver сосредоточится на первом значимом элементе в верхней части экрана при каждом появлении нового экрана.
Я уже попробовал все часто предлагаемые и рекомендуемые в настоящее время подходы (по состоянию на 2025 год), в том числе:
Код: Выделить всё
UIAccessibility.post(notification: .screenChanged, argument: ...)Код: Выделить всё
UIAccessibility.post(notification: .layoutChanged, argument: ...)- Обертывание сообщений о специальных возможностях внутри DispatchQueue.main.async в моделях представления, экранах или разделах.
- Использование частной переменной @AccessibilityFocusState isFocused: Bool, а затем Text("Screen title").accessibilityFocused($isTitleFocused) и .onAppear { isTitleFocused = true
- Использование приоритета доступности
Ожидаемое поведение:
При переходе на новый экран фокус VoiceOver должен сбрасываться на самый верхний доступный экран. элемент этого экрана.
Фактическое поведение:
Фокус VoiceOver остается на предыдущем элементе или попадает в середину/нижнюю часть экрана.
Вот несколько примеров того, как я применил различные решения в своих файлах:
ViewModel:
Код: Выделить всё
/// ViewModel for the WomenCarePoint Home screen
final class WomenCarePointHomeViewModel: @unchecked Sendable,
WomenCarePointHomeViewModelContract,
WomenCarePointHomeListSectionViewModelContract,
WomenCarePointHomeFooterSectionViewModelContract,
WomenCarePointHomeHeaderSectionViewModelContract,
CrossErrorSectionViewModelContract {
// MARK: - UseCase
...
// MARK: - Published Properties
...
// MARK: - Publishers
...
// MARK: - Inputs
/// Called when the view appears
public func notifyAppearance() {
loadData()
DispatchQueue.main.async {
// UIAccessibility.post(notification: .screenChanged, argument: nil)
Подробнее здесь: [url]https://stackoverflow.com/questions/79860389/voiceover-focus-does-not-reset-to-top-when-navigating-between-screens-in-swiftui[/url]
Мобильная версия