tvOS 如何检查 UITabBar 是否处于焦点状态

4

我正在寻找一种方法,在从或到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个回答

2
这个答案可能对提问者没有帮助(问题已经超过一年了),但是我也遇到了同样的问题,来自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
    }
}

我相信提问者早已解决了这个问题,但我认为我可以为后来有同样问题的人提供帮助。


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子类中覆盖此方法


-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)

如果不需要,可以忽略这个提示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接