【问题标题】:Making the first cell of a UICollectionView focused on tvOS使 UICollectionView 的第一个单元格专注于 tvOS
【发布时间】:2015-11-21 11:32:39
【问题描述】:

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

我试图创建一个UICollectionViewCell 子类并拥有方法

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

没有成功。

有没有办法做到这一点?

【问题讨论】:

    标签: uicollectionview uicollectionviewcell tvos


    【解决方案1】:

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

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

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

    UIViewController 实现 preferredFocusedView 以返回它的 view 属性。 UIView 只是返回自己。

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

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

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

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

    【讨论】:

    • 现在我们正在讨论。我想知道为什么 Apple 从不雇用像你这样的人来编写他们的文档。相反,他们写的是讨厌写作的人。完美的!谢谢!
    • 如果从某个服务获取数据不要忘记写 [self setNeedsFocusUpdate];在collectionview reloadData/reloadSection 语句之后。
    • 关于以编程方式更改集合视图中聚焦的单元格的任何指导?
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      你可以用这个方法,苹果documentation

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

      你可以返回任何你想要的 indexPath ..

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

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我有这个方法,但现在我如何聚焦一个单元格?
      • 您是在问如何聚焦​​“特定”单元格吗?您的问题是“第一个单元格”。我的应用程序中的上述方法关注第一个单元格。但是,如果您的视图中有多个可聚焦的项目,则可能需要其他解决方案
      • 不,我指的是第一个单元格。由于某种原因,这对我不起作用。顺便说一句,如果没有提到第一个单元格,为什么这种方法会起作用?我不确定我是否能很好地解释自己。我想要的是:CollectionViewController 出现并且第一个单元格被聚焦(我的意思是巨大的,因为一个聚焦的单元格应该在 tvOS 中)。
      • 也许在这里发布您的控制器代码。它对我来说很好,并显示了第一个单元格的焦点,在模拟器中我可以移动右箭头来浏览我的集合视图单元格。您是否删除了“preferredFocusedView”方法?
      • 该方法不是将焦点引导到特定项目的方法;这更像是一种“否决”的方式,允许焦点转移到某个地方。如果你根本不实现该方法,它与实现它总是返回 true 是一样的。
      猜你喜欢
      • 1970-01-01
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多