使 UICollectionView 的第一个单元格专注于 tvOS

Making the first cell of a UICollectionView focused on tvOS

好的,如果我有一个 UIViewController 如果我使用这个 `preferredFocusedView,我可以使视图聚焦于 tvOS,但是如何使 UICollectionView 的第一个单元格聚焦?我该怎么做?

我已经尝试创建一个 UICollectionViewCell 子类并使用方法

- (UIView *)preferredFocusedView {
   return ([self ifThisIsTheFirstCell]) ? self : nil;
}

没有成功。

有办法吗?

如果您不想 return 在某些情况下为真,则需要添加此 UICollectionViewDelegate 方法和所需的任何逻辑

  func collectionView(collectionView: UICollectionView, shouldUpdateFocusInContext context: UICollectionViewFocusUpdateContext) -> Bool {
    return true
  }

"preferred focus" 在概念上的工作方式是,有一个 "chain" 对象从您的应用程序的 window 开始,向下通过视图控制器和视图,直到链结束于可聚焦看法。最后的那个视图是当你的应用程序启动时将获得焦点的东西,或者如果需要重置焦点(例如,如果当前聚焦的视图从视图层次结构中删除,UIKit 将需要选择另一个视图来获得焦点) . preferredFocusedView 方法是您定义链的方式。

例如,UIWindow 实现 preferredFocusedView 到 return rootViewController 的首选聚焦视图。在摘要中,t 正在做这样的事情:

- (UIView *)preferredFocusedView {
    return [self.rootViewController preferredFocusedView];
}

UIViewController 实现 preferredFocusedView 到 return 它是 view 属性。 UIView 只是 return 本身。

然而,UICollectionView 以不同方式实现 preferredFocusedView:在最简单的情况下,它 return 是第一个单元格。所以你想要的那部分已经为你完成了。如果焦点没有移动到您集合中的第一个单元格,那么 "chain" 中更高的部分就是问题所在。

如果你的视图控制器的集合视图不是视图控制器的 view 属性,那么你需要自己将焦点链引导到集合:

// in your view controller:
- (UIView *)preferredFocusedView {
    return myCollectionView;
}

从那里,集合视图会将链引导到特定的单元格。

苹果可以用这个方法documentation

func indexPathForPreferredFocusedView(in collectionView: UICollectionView) -> IndexPath? {
    return IndexPath(item: self.datasourceArray.count, section: 0)
}

您可以 return 任何您想要的 indexPath ..

例如IndexPath(item: 0, section: 0)

我喜欢一个更新的答案,因为 (UIView *)preferredFocusedView 自 TVOS 10 以来已被弃用,而且实际上有一种非常简单的方法来默认聚焦第一个单元格甚至最后一个单元格

- (NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments
{
     return @[myCollectionView.visibleCells.firstObject];
}

或者您可以使用下一个代码来聚焦最后一个单元格

- (NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments
{
    return @[myCollectionView.visibleCells.lastObject];
}