Objective c tvOS:当按钮按水平顺序排列时,焦点第一按钮作为首选焦点视图

Objective c tvOS:当按钮按水平顺序排列时,焦点第一按钮作为首选焦点视图,objective-c,swift2,tvos,apple-tv,Objective C,Swift2,Tvos,Apple Tv,我一直在尝试对第一个按钮进行对焦,但对焦引擎将选项卡栏正下方的第三个按钮作为第一个要对焦的项目。我尝试了首选聚焦视图,但发现当我按垂直顺序放置按钮时,首选视图将聚焦,但当我将所有按钮放置在水平面时,总是使用第三个按钮。我可以想到另一种方法,如果使用“聚焦向导”,但我想知道在这种情况下如何工作情景 override weak var preferredFocusedView: UIView? { get { return thrirdButton

我一直在尝试对第一个按钮进行对焦,但对焦引擎将选项卡栏正下方的第三个按钮作为第一个要对焦的项目。我尝试了首选聚焦视图,但发现当我按垂直顺序放置按钮时,首选视图将聚焦,但当我将所有按钮放置在水平面时,总是使用第三个按钮。我可以想到另一种方法,如果使用“聚焦向导”,但我想知道在这种情况下如何工作情景

 override weak var preferredFocusedView: UIView? {
        get {
            return thrirdButton
        }
    }
这是因为焦点引擎将最接近的焦点元素作为第一个元素,正如您从所附图片中看到的。我已附上视图控制器的上下文屏幕截图。任何帮助或线索,以解决这将不胜感激


尝试在按钮行上方添加UIFocusGuide。在这种情况下,在到达按钮之前,它将点击您的焦点指南,您可以在其中将preferredFocusedView重定向到该特定按钮。要重定向的代码将通过重写didUpdateFocusInText方法来完成

假设您已经在viewDidload中设置了焦点向导,下面是一个示例

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {
    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)

    self.focusGuide.preferredFocusedView = self.mypreferredbutton
}
初始化焦点指南(在viewDidLoad中添加查看指南)

我也面临着类似的问题,但不知何故,我能够通过这一点做到这一点。preferredFocusedView方法也会起作用,但您必须通过更新一些引用变量,然后为该视图调用setneedsfocusupdate来完成大量的工作。尝试聚焦引导方式。希望能有帮助

编辑: 我已经添加了如何设置指南的代码。在这种情况下,我将指南放在视图的右侧。因此,每当您的焦点点击指南时,它都会重定向到您希望焦点在DidUpdateFocusInText中转到的preferredfocusguide视图。“任何时候都只有一个视图处于焦点位置。”,还记得这些吗?因此,当它点击指南时,被覆盖的方法就会被点击,从而将焦点转移到指南的首选视图。举个例子,你可以参考苹果的iKitCatLog应用程序,这里有一个解释同样的问题

解决方案: 我们需要在按钮3上方添加聚焦指南,并在聚焦指南聚焦时将其重定向到按钮1

private var focusGuide = UIFocusGuide()
self.view.addLayoutGuide(focusGuide)

    self.focusGuide.bottomAnchor.constraintEqualToAnchor(self.button3.topAnchor).active = true
    self.focusGuide.leftAnchor.constraintEqualToAnchor(self.button3.leftAnchor).active = true
    // Width and height
    self.focusGuide.widthAnchor.constraintEqualToAnchor(self.button3.widthAnchor).active = true
    self.focusGuide.heightAnchor.constraintEqualToAnchor(self.button3.heightAnchor).active = true
    focusGuide.centerXAnchor.constraintEqualToAnchor(self.button3.centerXAnchor).active = true


  override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {

        self.focusGuide.preferredFocusedView = button1
    }

感谢您的回复Shane:我尝试通过指南添加首选焦点视图,但没有任何帮助。我没有太多使用指南,而且我是tvOS新手。你能分享一下创建指南的想法吗?像你一样点击第一个按钮吗?再看一遍我的答案。我已经添加和编辑了更多的参考资料。谢谢Shane-我阅读了教程,它真的很有帮助。因此,如果我们想做任何像这样的自定义导航,我们需要添加一个焦点指南,并根据我们的要求从didupdateFocus委托方法重定向。我在按钮3上方添加了焦点指南,它可以工作。如果解决方案可行,您能选择首选答案吗,因此,其他回答此问题的人可以参考正确答案。此外,适当的做法是将焦点指南的长度延伸到所有4个按钮之上。这样,每当焦点来自上方时,它首先点击的是您的向导,而不是任何其他按钮。
private var focusGuide = UIFocusGuide()
self.view.addLayoutGuide(focusGuide)

    self.focusGuide.bottomAnchor.constraintEqualToAnchor(self.button3.topAnchor).active = true
    self.focusGuide.leftAnchor.constraintEqualToAnchor(self.button3.leftAnchor).active = true
    // Width and height
    self.focusGuide.widthAnchor.constraintEqualToAnchor(self.button3.widthAnchor).active = true
    self.focusGuide.heightAnchor.constraintEqualToAnchor(self.button3.heightAnchor).active = true
    focusGuide.centerXAnchor.constraintEqualToAnchor(self.button3.centerXAnchor).active = true


  override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) {

        self.focusGuide.preferredFocusedView = button1
    }