Как удалить голос uiAccessibility через пользовательские роторы

Мы используем сложный экран календаря. (Лучше всего переписать все, но, к сожалению, сейчас это не вариант). Этот экран позволяет переключаться между обзором дня, обзором недели и обзором месяца. В зависимости от вида мы хотим иметь разные роторы.

  • Обзор дня не имеет роторов и представляет собой простой tableViewController.
  • неделя имеет роторы для каждого дня недели и представляет собой collectionView.
  • у месяца есть роторы на каждый день, на который запланировано что-либо в этот день, и это набор просмотров таблиц за день.

есть контроллер вида сверху (CalendarViewController), который имеет несколько других (неинтересных для этого кода) viewController и ContainerSwitchViewController, основанный на https://github.com/levigroker/GRKContainerViewController . По сути, он заменяет свое содержимое одним из трех контроллеров представления (день, неделя, месяц).

Каждый раз, когда контроллеры представления вызывают viewDidLoad для этих viewControllers, и в viewDidLoad я создаю собственный ротор. В обзоре недели я использую этот код для создания собственного ротора на каждый день недели.

      private func customRotorFor(weekday: weekday) -> UIAccessibilityCustomRotor {
    UIAccessibilityCustomRotor(name: weekday.toString()) { predicate in
        let currentElement = predicate.currentItem.targetElement as? CalendarWeekOverviewCollectionViewCell
        let eventsOfTheDay = self.eventsOfTheDay(for: weekday)
        let currentIndex = eventsOfTheDay.firstIndex { $0 == currentElement }
        let targetIndex: Int
        switch predicate.searchDirection {
        case .previous:
            targetIndex = (currentIndex ?? 1) - 1
        case .next:
            targetIndex = (currentIndex ?? -1) + 1
        }
        guard 0..<eventsOfTheDay.count ~= targetIndex else { return nil } // reached boundary
        let targetElement = eventsOfTheDay[targetIndex]
        return UIAccessibilityCustomRotorItemResult(targetElement: targetElement, targetRange: nil)
    }
}

это создает правильный ротор для меня и читает и перемещается точно так, как я хочу, кодовый блок UIAccessibilityCustomRotor.Search работает нормально.

Я вызываю эту функцию в viewDidLoad, перебирая все случаи будних дней.

      UIApplication.topViewController()?.accessibilityCustomRotors = weekday.allCases.map { self.customRotorFor(weekday: $0) }

с днем ​​недели, являющимся простым перечислением

      enum weekday: Int, CaseIterable {
        case monday = 0
        case tuesday = 1
        case wednesday = 2
        case thursday = 3
        case friday = 4
        case saturday = 5
        case sunday = 6
        
        func toString() -> String {
            switch self {
            case .monday: return "maandag"
            case .tuesday: return "dinsdag"
            case .wednesday: return "woensdag"
            case .thursday: return "donderdag"
            case .friday: return "vrijdag"
            case .saturday: return "zaterdag"
            case .sunday: return "zondag"
            }
        }
    }

Я могу установить пользовательский ротор на сам viewController (вместо верхнего приложения). Только тогда ротор активируется, когда пользователь находится на вершине ячейки. Если ячеек нет или их мало, пользователю будет трудно найти место для активации пользовательского ротора. Установка в верхнем контроллере просмотра приложения доступна на весь экран, что является именно тем поведением, которое я хочу.

Однако после первого viewDidLoad (по умолчанию для containerwitchviewcontroller используется недельный обзор) настройка UIApplication.topviewcontrollers uiaccessibilityCustomRotors больше не устанавливается. Я могу установить роторы на свои пользовательские роторы, как описано выше, а затем установить для них значение [] или nil, и они не будут добавляться/удаляться. Если я переключу порядок кода и сначала установлю его на nil/[], а затем на мои пользовательские роторы, они будут видны. Так что я знаю, как я могу установить или отключить роторы. Однако, когда я пытаюсь установить это после первоначального viewDidLoad, это не работает, и роторы (включая их элементы) остаются активными.

Я хочу удалить пользовательские роторы доступности (предпочтительно в viewDidLoad), чтобы каждый viewDidLoad мог использовать свои собственные пользовательские роторы.

Я также пытался инициировать изменения жизненного цикла с помощью layoutSubViews, loadView и т. д., а также публиковать уведомления UIAccessibility (.screenchanged и .layoutChanged)

Я также попытался установить его в представление topviewcontrollers, а не в представление, но это не имело значения.

0 ответов

Другие вопросы по тегам