0

我目前正在开发 Apple TV 应用程序。我的视图是这样从左到右建立的(另见截图)

  • 小的UICollectionView
  • UIImageview
  • UIView
    • UILabels
    • UIButton

在此处输入图像描述

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
        }
    }
4

3 回答 3

1

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

1)将每个collectionview作为一个自定义视图,以UIView作为父类,按照Apple的Dev Doc中的指南如下支持自定义视图中的焦点

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

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

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

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

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

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

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

于 2016-01-19T16:43:48.090 回答
0

我只能猜测,因为我还没有在 AppleTV 上工作,但据我了解你在做什么,你不能从收藏视图的第一个单元格中聚焦按钮。我的猜测是,您没有明确告诉系统应该从特定元素中获得焦点。系统“看到”您要聚焦的按钮距离垂直轴上的第一个单元格太远。由于第二个单元更近,系统允许它移动。

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

于 2016-01-14T16:09:45.893 回答
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
于 2016-05-27T17:47:23.553 回答