4

我正在寻找一种在将焦点从 UITabBar 更改为 UITabBar 时进行自定义转换的方法。

我目前正在通过覆盖该didUpdateFocus方法来尝试此操作,但我似乎无法检查 tabBar 是否已聚焦。

tabBar 本身似乎永远不会处于“集中”状态:

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinatora)
{
    super.didUpdateFocus(in: context, with: coordinator)

    print(self.tabBar.isFocused) // always false
}

当检查UIFocusUpdateContext当前聚焦的元素是一个UITabBarButton.

但我无法检查上下文是否是一个实例,UITabBarButton因为该类型不可用:

context.nextFocusedItem is UITabBarButton // can't compile

我真的被困在这里,并且希望有任何关于如何解决这个问题的建议。

谢谢。

4

3 回答 3

2

这个答案可能对 OP 没有帮助(一年多以前有人问过),但是当我在同一个问题上苦苦挣扎时,WWDC17的一个演示文稿帮助我弄清楚了:

UIView, UIViewController,UIWindow等都符合UIFocusEnvironment协议。tabBar 本身实际上从未直接获得焦点,因此检查其中一个按钮是否具有焦点的正确方法是检查其环境是否包含 UIFocusItem:

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    if let nextFocusedItem = context.nextFocusedItem,
        self.tabBar.contains(nextFocusedItem) {
        //Do some stuff
    }
}

我敢肯定提问者很久以前就知道了,但我想我会把这个答案抛给其他碰巧有同样问题的人。

于 2020-05-22T14:48:17.590 回答
0

首先添加扩展UIView是否有超级视图:

public func hasSuperView(_ view: UIView) -> Bool {
    if self == view {
        return true
    }
    if let superview = superview {
        return superview.hasSuperView(view)
    }
    return false
}

然后添加扩展UIFocusUpdateContext以检查视图是否具有焦点:

public func viewHasFocus(_ view: UIView) -> Bool {
    guard let nextFocusedView = nextFocusedView else { return false }
    return nextFocusedView.hasSuperView(view) || view.hasSuperView(nextFocusedView)
}

然后在这个方法中使用 context 来检查 tabbar 是否有焦点:

   override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
    if context.viewHasFocus(tabBar) {}
}

另外请在您的 UITabBarController 子类中覆盖此方法

于 2020-07-16T11:02:48.433 回答
-1

我在 UIView 上创建了扩展,它将检查其层次结构中是否有焦点:

func containsFocus() -> Bool {
    if self.isFocused { return true }
    else {
        for subview in self.subviews {
            if subview.containsFocus() { return true }
        }

        return false
    }
}

这样你可以检查你的 UITabBar 是否有焦点。

笔记:

这是检查视图是否具有焦点的非常昂贵的方法,因为它是递归函数,它可能会遍历视图的整个层次结构。

小费:

如果您在 UITabBar 中选择选项卡时尝试实现自定义转换,您应该使用 UITabBarDelegate 方法:

 func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem)

如果没有,请忽略此提示。

于 2019-05-28T12:36:17.757 回答