tvOS如何检查UITabBar是否聚焦

时间:2019-03-26 13:58:36

标签: ios swift focus tvos focus-engine

我正在寻找一种在将焦点从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

我真的被困在这里,很乐意就如何解决这一问题提出任何建议。

谢谢。

3 个答案:

答案 0 :(得分:2)

这个答案可能不会对OP有所帮助(一年多以前被问到),但是当我在同一个问题上苦苦挣扎时,WWDC17的一次演讲帮助我弄清楚了:

UIViewUIViewControllerUIWindow等都符合UIFocusEnvironment协议。 tabBar本身从未真正获得直接焦点,因此检查其按钮之一是否具有焦点的正确方法是检查其环境是否包含UIFocusItem:

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

我敢肯定,问问者是很久以前才想到的,但是我想我会将这个答案交给后来碰到相同问题的其他人。

答案 1 :(得分:0)

我已经在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)

否则,请忽略此提示。

答案 2 :(得分: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)
}

然后在此方法中使用上下文来检查标签栏是否具有焦点:

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

还请在您的UITabBarController子类中重写此方法