Ios 从tvOS中的可滚动区域转义

Ios 从tvOS中的可滚动区域转义,ios,objective-c,iphone,tvos,focus-engine,Ios,Objective C,Iphone,Tvos,Focus Engine,我理解焦点引擎将决定可以选择什么的概念。它似乎还垂直或水平线性移动,并试图找到视图与垂直或水平线相交的下一个最近的邻居 我还没有解决的问题是如何进行设置,以便在其中一个具有可滚动区域(如地图)的子视图之间切换可聚焦子视图时,不会阻止平移 我有两个集合视图,占据屏幕的宽度,一个位于另一个之上。我可以在这两者之间切换。下面是重写其共享自定义UICollectionView类的代码 override public func canBecomeFocused() -> Bool {

我理解焦点引擎将决定可以选择什么的概念。它似乎还垂直或水平线性移动,并试图找到视图与垂直或水平线相交的下一个最近的邻居

我还没有解决的问题是如何进行设置,以便在其中一个具有可滚动区域(如地图)的子视图之间切换可聚焦子视图时,不会阻止平移

我有两个集合视图,占据屏幕的宽度,一个位于另一个之上。我可以在这两者之间切换。下面是重写其共享自定义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,但没有成功

还有其他人有类似的经历吗?如何在不必添加另一个对话或其他内容以将上下文切换回集合视图的情况下返回地图视图


提前谢谢。

我相信有很多方法可以解决这个问题(比如Eugene在评论中提出的方法)。通常,您可能需要确定何时希望焦点离开映射并使用
setNeedsFocusUpdate()
updateFocusIfNeeded()
触发焦点更新。然后,您将覆盖
首选焦点视图
UIFocusEnvironment
的一部分,该部分由
UIViewController
UIView
采用),以将焦点设置为所需的任何位置


真正的诀窍是确定何时适合这样做。地图是特别硬的,因为它可能在到达边界之前滚动很长时间(如果有)。因此,您可能需要按照Eugene的建议使用按钮按下,或者通过实现一些
MKMapViewDelegate
方法,如
mapView(\uu:regionWillChangeAnimated:)
来确定地图何时移动了很长的距离。当然,“正确”的答案将由您想要的行为决定。

您是否试图强制地图在“地图按下”或“菜单按下”时失去焦点?我觉得这是唯一的解决办法。我有一个类似的问题,添加这个特殊的手势/按下事件解决了这个问题。