Фокус VoiceOver не сбрасывается вверх при навигации между экранами в SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Фокус VoiceOver не сбрасывается вверх при навигации между экранами в SwiftUI

Сообщение Anonymous »

Я разрабатываю приложение для iOS с использованием SwiftUI, и у меня постоянно возникают проблемы с фокусом специальных возможностей VoiceOver при навигации между экранами.
При переходе с одного экрана на другой фокус 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»