我一直在尝试聚焦第一个按钮,但聚焦引擎将第三个按钮放在标签栏的正下方,作为第一个要聚焦的项目。我尝试了首选焦点视图,但发现当我按垂直顺序放置按钮时,首选会将首选视图聚焦,但是当我将所有按钮放在水平平面时,它总是需要第三个按钮。我可以想到的另一种方法,如果焦点指南,但我想知道这将如何在这种情况下工作?
override weak var preferredFocusedView: UIView? {
get {
return thrirdButton
}
}
这是因为焦点引擎将最近的焦点元素作为第一个元素,如附图所示。我附加了视图控制器的上下文截图。任何帮助或线索来解决这个问题将不胜感激。
答案 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
}