0

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

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

我有两个集合视图,它们占据了屏幕的宽度,一个在另一个之上。我可以平移在这些之间切换就好了。这是覆盖他们共享的自定义 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,但无济于事。

其他人有类似的经历吗?我如何退出地图视图而无需添加另一个对话或其他东西来将上下文切换回集合视图?

先感谢您。

4

1 回答 1

0

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

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

于 2016-02-25T19:43:25.290 回答