Выход из прокручиваемых областей в TVOS

Я понимаю концепцию, что двигатель фокуса решит, что может быть выбрано. Также кажется, что он движется линейно вертикально или горизонтально и пытается найти следующего ближайшего соседа, вид которого пересекает эту вертикальную или горизонтальную линию.

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

У меня есть два вида коллекции, которые занимают всю ширину экрана и располагаются один над другим. Я могу переключаться между ними просто отлично. Вот код, который переопределяет их общий пользовательский класс UICollectionView

    override public func canBecomeFocused() -> Bool {
    return true
}

public override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool {

    return true
}

public override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {

    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)

}

В отдельном контроллере представления у меня есть представление карты и представление коллекции выше этого. Оба занимают ширину экрана. Я могу перемещаться, чтобы переключиться с представления коллекции на представление карты, но независимо от того, насколько медленным или быстрым я пытаюсь перемещаться / перемещаться вверх, я не могу заставить вид карты потерять фокус.

Я попытался добавить некоторые распознаватели жестов и установить методы делегата, чтобы попытаться заставить мой GR победить прокручивающиеся GR вида карты, но безрезультатно.

У кого-нибудь еще есть подобный опыт? Как мне вернуться из вида карты, не добавляя другой диалог или что-то еще, чтобы переключить контекст обратно в вид коллекции?

Заранее спасибо.

1 ответ

Я уверен, что есть несколько способов решить проблему (например, предложенный в комментарии Юджина). В общем, вам, вероятно, нужно определить, когда вы хотите, чтобы фокус покинул карту, и активировать обновление фокуса с помощью setNeedsFocusUpdate(), updateFocusIfNeeded(), Вы бы тогда переопределить preferredFocusView (часть UIFocusEnvironment который принят UIViewController а также UIView среди прочего), чтобы сосредоточиться на том, что вы хотите.

Настоящий трюк состоит в том, чтобы определить, когда это уместно сделать. Карта особенно сложна, потому что вполне возможно, что она может прокручиваться в течение очень долгого времени, прежде чем ударить по границе (если это когда-либо произойдет). Таким образом, вам, возможно, придется использовать нажатие кнопки в соответствии с предложением Евгения или, возможно, путем реализации некоторых из MKMapViewDelegate методы, такие как mapView(_:regionWillChangeAnimated:) определить, когда карта переместилась на большое расстояние. Конечно, "правильный" ответ будет определяться вашим желаемым поведением.

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