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



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

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

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

没有成功。

有办法做到这一点吗?

"首选焦点"在概念上的工作方式是,有一个对象"链"从应用程序的窗口开始,向下穿过视图控制器和视图,直到链在可聚焦视图结束。当你的应用程序启动时,或者如果需要重置焦点(例如,如果当前聚焦的视图从视图层次结构中删除,UIKit将需要选择另一个视图来聚焦),最后的视图将成为焦点。preferredFocusedView方法是定义链的方式。

例如,UIWindow实现preferredFocusedView以返回rootViewController的优选聚焦视图。抽象地说,它正在做这样的事情:

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

UIViewController实现preferredFocusedView以返回其view属性。UIView只是返回自身。

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

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

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

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

我有一个更新的答案,因为(UIView*)preferredFocusedView自TVOS 10以来一直被弃用,而且实际上有一种非常简单的方法可以在默认情况下获得第一个单元格,甚至最后一个单元格的焦点

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

或者您可以使用下一个代码来关注最后一个Cell

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

您可以使用此方法,Apple文档

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新