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

cre*_*_rd 5 objective-c apple-tv swift2 tvos

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

 override weak var preferredFocusedView: UIView? {
        get {
            return thrirdButton
        }
    }
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为焦点引擎将最近的可能焦点元素作为第一个元素,正如您从所附图片中看到的那样。我已附上视图控制器的上下文屏幕截图。任何解决此问题的帮助或线索将不胜感激。

预期焦点路径 - 蓝色与默认 - 红色 上下文路径

Sha*_*e D 2

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

假设您已经在 viewDidload 中设置了焦点引导,以下是示例,

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

    self.focusGuide.preferredFocusedView = self.mypreferredbutton
}
Run Code Online (Sandbox Code Playgroud)

初始化焦点指南(在 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
Run Code Online (Sandbox Code Playgroud)

我也遇到了类似的问题,但以某种方式能够通过这个来做到这一点。PreferredFocusedView 方法也可以工作,但是您必须通过更新一些引用变量然后为该视图调用 setneedsfocusupdate 来完成很多马戏表演。尝试对焦引导方式。希望能帮助到你。

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