Реализация пользовательского поведения фокуса для UICollectionView на AppleTV
Я пытаюсь реализовать довольно простой пользовательский интерфейс на tvOS, и после нескольких сбоев кажется, что это невозможно.
У меня есть 2 просмотра коллекции с горизонтальной прокруткой.
- 1-й - города
- 2-й - варианты
Набор параметров одинаков для всех городов, но некоторые параметры могут быть отключены для некоторых городов. По крайней мере, один вариант доступен для каждого города.
Пользователь может выбрать город и вариант для него, сосредоточившись на конкретной ячейке. Текущий выбор виден на экране (см. Ярлыки под коллекциями)
То, что я пытаюсь сделать, это запомнить выбранный город / опцию, поэтому, когда я изменяю опцию между этими видами коллекции - ранее выбранный элемент становится фокусированным (выделенным). Это можно сделать с помощью remembersLastFocusedIndexPath
флаг для UICollectionView
но представление коллекции игнорирует отключенные ячейки.
Например, в прикрепленном проекте вариант 3 для Дублина отключен. Таким образом, если пользователь выбирает Лондон, затем выбирает вариант 3, затем перемещает фокус обратно в представление коллекции городов и меняет выбор на Дублин, тогда вариант 3 становится недоступным (isUserInteractionEnabled
является false
а также collectionView(_ collectionView:, canFocusItemAt indexPath:)
возвращается false
). Однако если remembersLastFocusedIndexPath
Значение true - представление коллекции игнорирует все эти элементы и пытается сфокусировать отключенный элемент. На данный момент пользовательский интерфейс коллекции "сломался":
Есть indexPathForPreferredFocusedView(in:)
метод, но он срабатывает только один раз для предпочтительного UICollectionView
хотя это не очевидно из документации Apple.
Есть ли способ написать "пользовательскую" логику для фокусировки ячеек? Что мне нужно реализовать для представления коллекции параметров, так это выбрать текущий выбранный параметр, если он доступен, или первый доступный параметр, если выбранный в данный момент параметр отключен каждый раз, когда он получает фокус. Наследование UICollectionView
не должен быть способ решить это, поскольку он не должен знать о модели данных.
Здесь вы можете скачать тестовый проект