Подтвердить что ты не робот

Как управлять объектами фокусировки tvOS для изогнутых SKNodes

Приложение tvOS создает игровое поле с использованием SKNodes, которое выглядит следующим образом:

введите описание изображения здесь

Каждая форма, разделенная линиями, представляет собой SKNode, который является фокусируемым (например, каждый цветной клин состоит из 5 SKNodes, которые постепенно уменьшаются по размеру ближе к центру).

Моя проблема заключается в том, что движок фокуса не фокусирует следующий пункт фокусировки (SKNode), который будет выглядеть как логический, наиболее естественный следующий node для фокусировки. Эта проблема связана с тем, что логика ядра фокусировки является прямоугольной, а мои SKNodes изогнуты. Как вы можете видеть ниже, существуют неотъемлемые проблемы при попытке выяснить следующий элемент с возможностью фокусировки при прокрутке вниз от внешнего желтого SKNode:

введите описание изображения здесь

В приведенном выше примере движок фокуса вычитает, что в настоящее время сфокусированная область является областью в красно-заштрихованном прямоугольнике на основе краев node. Благодаря этой логике сфокусированный прямоугольник перекрывает области, которые не являются частью фокусированного в настоящее время node, включая всю ширину второго желтого SKNode. Поэтому при прокрутке вниз двигатель фокусировки пропускает фокус на третий (средний) желтый SKNode.

Как бы решить проблему этого фокуса, чтобы фокус был более естественным как по вертикали, так и по горизонтали для моего кругового игрового поля SKNodes без кажущегося столь спорадического? Это возможно? Возможно, с UIFocusGuides?

4b9b3361

Ответ 1

Вы должны обрабатывать фокус вручную. Используйте методы, перечисленные ниже, чтобы проверить следующее сфокусированное представление из контекста.

func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool

В этом методе вы получите направление фокуса (UIFocusHeading). Перехватите требуемое направление и сохраните требуемый следующий сфокусированный вид в некотором свойстве. Обновите фокус вручную, вызвав следующие методы

setNeedsFocusUpdate()

updateFocusIfNeeded()

Это вызовет ниже

preferredFocusEnvironments: [UIFocusEnvironment] { get }

При этом проверьте сохраненный экземпляр и верните то же самое. Это поможет вам справиться с фокусом вручную в соответствии с вашими требованиями.