tvOS:当按钮处于水平顺序时,将第一个按钮聚焦为首选焦点视图

时间:2016-01-23 17:24:25

标签: objective-c swift2 tvos apple-tv

我一直在尝试聚焦第一个按钮,但聚焦引擎将第三个按钮放在标签栏的正下方,作为第一个要聚焦的项目。我尝试了首选焦点视图,但发现当我按垂直顺序放置按钮时,首选会将首选视图聚焦,但是当我将所有按钮放在水平平面时,它总是需要第三个按钮。我可以想到的另一种方法,如果焦点指南,但我想知道这将如何在这种情况下工作?

 override weak var preferredFocusedView: UIView? {
        get {
            return thrirdButton
        }
    }

这是因为焦点引擎将最近的焦点元素作为第一个元素,如附图所示。我附加了视图控制器的上下文截图。任何帮助或线索来解决这个问题将不胜感激。

Focus path expected-Blue vs default-Red Context Path

2 个答案:

答案 0 :(得分:2)

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

假设您已在viewDidload中设置了焦点指南,以下是一个示例

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

    self.focusGuide.preferredFocusedView = self.mypreferredbutton
}

初始化焦点指南(添加指南以在viewDidLoad中查看)

    var focusGuide = UIFocusGuide()

    self.view.addLayoutGuide(self.sidefocusGuide)
    self.focusGuide.leftAnchor.constraintEqualToAnchor(self.placerLabel.leftAnchor).active = true
    self.focusGuide.rightAnchor.constraintEqualToAnchor(self.placerLabel.rightAnchor).active = true
    self.focusGuide.topAnchor.constraintEqualToAnchor(self.audioTable.topAnchor).active = true

我也遇到了类似的问题,但通过这种方式可以做到这一点。首选的FocusView方法也可以使用,但你必须通过更新一些引用变量然后为该视图调用setneedsfocusupdate来完成大量的马戏团。尝试焦点指南方式。希望它有所帮助。

<强>编辑: 我添加了代码如何设置指南。在这种情况下,我将指南放在我视图的右侧。因此,只要您的焦点点击指南,它就会重定向到您希望焦点转到didUpdateFocusInContext中的preferredfocusguide视图。 “任何时候都只有一个焦点。”,还记得吗?因此,当它击中指南时,覆盖方法会被击中,从而将焦点移动到指南的首选视图。例如,您可以参考Apple的UIKitCatlog应用程序获取tvOS,这里有一个link解释相同的内容。

答案 1 :(得分:1)

解决方案: 我们需要在按钮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
    }

Context for the focus guide shown in sky blue