Выход из прокручиваемых областей в 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:)
определить, когда карта переместилась на большое расстояние. Конечно, "правильный" ответ будет определяться вашим желаемым поведением.