逃离tvOS中的可滚动区域

时间:2016-02-24 09:02:48

标签: ios objective-c iphone tvos focus-engine

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

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

我有两个收集视图占据了屏幕的宽度,并且一个坐在另一个的顶部。我可以平移在这些之间切换就好了。以下是覆盖其共享自定义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 个答案:

答案 0 :(得分:0)

我确定有很多方法可以解决这个问题(例如Eugene评论中提出的方法)。通常,您可能需要确定何时希望焦点离开地图并使用setNeedsFocusUpdate()updateFocusIfNeeded()触发焦点更新。然后,您将覆盖preferredFocusView(由UIFocusEnvironmentUIViewController采用的UIView的一部分),以将焦点设置为您想要的任何内容。

真正的诀窍是确定何时适合这样做。地图特别难,因为它可能会在击中边界之前滚动很长时间(如果有的话)。因此,您可能需要按照Eugene的建议使用按钮按下,或者可能需要实施一些MKMapViewDelegate方法(如mapView(_:regionWillChangeAnimated:))来确定地图移动了很长的距离。 "正确"答案将取决于你想要的行为,当然。