当集中视图中的第一个单元格被聚焦时,无法聚焦uibutton

时间:2016-01-14 14:37:33

标签: ios objective-c swift tvos tvos9.1

我目前正在使用Apple TV应用。 我的观点是从左到右构建的(也见截图)

  • small UICollectionView
  • UIImageview
  • UIView
    • UILabels
    • UIButton

enter image description here

当我在第二个UIButton时,我只能将uicollectionviewCell对焦在右边。

当我在第一个和第三个单元格上时,我无法将焦点转移到UIButton

对此有何帮助?

修改

我在ViewDidLoad

中有这段代码

view.addLayoutGuide(focusGuide)

    focusGuide.leftAnchor.constraintEqualToAnchor(collectionView.leftAnchor).active = true
    focusGuide.topAnchor.constraintEqualToAnchor(collectionView.topAnchor).active = true
    focusGuide.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true
    focusGuide.heightAnchor.constraintEqualToAnchor(view.heightAnchor).active = true

并添加了此方法:

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

        guard let nextFocusedView = context.nextFocusedView else { return }

        switch nextFocusedView {
        case self.collectionView:
            self.focusGuide.preferredFocusedView = self.orderButton

        case self.orderButton:
            self.focusGuide.preferredFocusedView = self.collectionView

        default:
            self.focusGuide.preferredFocusedView = nil
        }
    }

3 个答案:

答案 0 :(得分:0)

我只能猜测,因为我还没有在AppleTV上工作,但据我了解你在做什么,你不能从你的集合视图的第一个单元格开始关注按钮。我的猜测是你没有明确地告诉系统什么应该从特定元素获得焦点。系统"见"您想要聚焦的按钮与垂直轴上的第一个单元格相距太远。由于第二个单元格更近,系统允许它移动。

正如我所说,这只是猜测我从Unity3D学到的GUI元素之间的自动链接,我可能完全错了,但这看起来真的很像我对我说的。

答案 1 :(得分:0)

您应该仔细检查您的collectionview的collecionviewcell中有关UIFocusEngine委托调用的代码。

1)将每个集合视图作为自定义视图包含UIView作为父类,按照Apple的Dev Doc指南进行如下操作 支持自定义视图中的焦点

  

与UIViewController一样,UIView也符合UIFocusEnvironment,这意味着视图控制器中支持焦点中概述的所有内容也适用于自定义视图。但是,由于视图可以聚焦,因此在实现自定义视图焦点行为时需要考虑一些额外的注意事项:

     

如果您的自定义视图需要具有焦点,请覆盖canBecomeFocused以返回YES(默认情况下,它返回NO)。   您的视图可能始终是可聚焦的,也可能只是有条件的可聚焦。例如,禁用时UIButton对象不可聚焦。   如果聚焦此视图,则可以选择覆盖preferredFocusedView,将焦点重定向到另一个视图(例如,子视图)。   覆盖didUpdateFocusInContext:withAnimationCoordinator:在焦点更新发生时响应它们并更新应用程序的内部状态。

2)在集合视图的焦点相关委托方法中,处理焦点更新到另一个单元格的情况,您希望通知UIFocusEngine正确更新新单元格中的上下文。

  

使用集合视图和表视图时,可以使用委托对象>来定义任何自定义行为。在实现基于焦点的界面时也会使用此模式。 UITableViewDelegate和UICollectionViewDelegate>协议声明类似于> UIFocusEnvironment协议提供的方法和属性,但用于表视图和集合视图行为。

     

在集合视图和表视图中支持焦点的提示:

     

使用带有UICollectionViewDelegate类的collectionView:canFocusItemAtIndexPath:方法或带有UITableViewDelegate类的tableView:canFocusRowAtIndexPath:方法来指定特定单元格是否应该是可聚焦的。此操作与在自定义视图中覆盖canBecomeFocused UIView方法类似。   使用在UICollectionView和UITableView中定义的remembersLastFocusedIndexPath属性,指定焦点离开后焦点是否应返回到最后一个聚焦索引路径,然后重新进入集合视图或表视图。

还有更多内容可以从https://developer.apple.com/library/tvos/documentation/General/Conceptual/AppleTV_PG/WorkingwiththeAppleTVRemote.html#//apple_ref/doc/uid/TP40015241-CH5-SW2

中读取

答案 2 :(得分:0)

您可以尝试以下方法吗?

    focusGuide.leftAnchor.constraintEqualToAnchor(imageView.leftAnchor).active = true
    focusGuide.rightAnchor.constraintEqualToAnchor(imageView.rightAnchor).active = true
    focusGuide.topAnchor.constraintEqualToAnchor(imageView. topAnchor).active = true
    focusGuide.bottomAnchor.constraintEqualToAnchor(imageView.bottomAnchor).active = true