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

时间:2015-11-21 11:32:40

标签: uicollectionview uicollectionviewcell tvos

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

我尝试创建UICollectionViewCell子类并使用方法

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

没有成功。

有办法吗?

4 个答案:

答案 0 :(得分:9)

“首选焦点”在概念上起作用的方式是,在应用程序窗口开始有一个“链”对象,通过视图控制器和视图向下,直到链在可聚焦视图结束。最后的视图是在您的应用程序启动时会集中注意力,或者如果需要重置焦点(例如,如果从视图层次结构中删除当前关注的视图,则UIKit将需要选择另一个视图以成为焦点) 。 free()方法是您定义链的方式。

例如,preferredFocusedView实现UIWindow以返回preferredFocusedView的首选焦点视图。在摘要中,我正在做这样的事情:

rootViewController

- (UIView *)preferredFocusedView { return [self.rootViewController preferredFocusedView]; } 实现UIViewController以返回preferredFocusedView属性。 view只是回归自己。

但是,UIView以不同方式实现UICollectionView:在最简单的情况下,它返回第一个单元格。所以你想要的部分已经为你完成了。如果焦点没有移动到你的集合中的第一个单元格,那么“链”中更高层的东西就是问题。

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

view

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

答案 1 :(得分:0)

您可以使用此方法Apple documentation

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

您可以返回所需的任何indexPath ..

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

答案 2 :(得分:0)

我喜欢一个更新的答案,因为(UIView *)preferredFocusedView自TVOS 10起就已弃用,并且实际上有一种非常简单的方法来使默认情况下第一个单元格,甚至最后一个单元格成为焦点

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

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

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

答案 3 :(得分:-1)

如果在某些情况下不想返回true,则需要添加此UICollectionViewDelegate方法和所需的任何逻辑

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