好的,如果我有一个UIViewController
我可以使用这个`preferredFocusedView来关注tvOS,但是如何让UICollectionView的第一个单元格聚焦?我该怎么做?
我尝试创建UICollectionViewCell
子类并使用方法
- (UIView *)preferredFocusedView {
return ([self ifThisIsTheFirstCell]) ? self : nil;
}
没有成功。
有办法吗?
答案 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
}