无法将焦点移动到 tvOS 中的下一个 UICollectionViewCell

Posted

技术标签:

【中文标题】无法将焦点移动到 tvOS 中的下一个 UICollectionViewCell【英文标题】:Can not move focus to next UICollectionViewCell in tvOS 【发布时间】:2016-02-01 08:36:41 【问题描述】:

我是 tvOS 应用程序的新手。我在UICollectionViewCell 中的UICollectionView 中创建了一个自定义按钮。当我加载视图控制器时,我将焦点移到 UICollectionView 的第一个单元格,但是通过按键盘上的下一个键,焦点不会移动到下一个单元格。

我的 UICollectionView 中有六个不需要滚动的单元格,这意味着这些单元格在 UICollectionView 的宽度内是合适的。有六个单元格,我无法将焦点移到下一个单元格。但是,如果我向 UICollectionView 添加一个单元格,焦点将正确移动到下一个单元格。我不确定发生了什么。谁能帮我解决这个问题?

谢谢

【问题讨论】:

查看github.com/NikKovios/TvOS-Debug-Hints 【参考方案1】:

我也有嵌套集合视图。对我来说,问题在于 inner 集合视图没有覆盖 -(BOOL)canBecomeFocus 并返回 NO

帮助我调试此问题的是打开视图层次结构,获取未获得焦点的视图地址(通过右键单击打印视图描述)并调用po [<view address> _whyIsThisViewNotFocusable] ,这很可能会告诉您问题所在。就我而言,它是这样写的:

Printing description of $3:
<_UIStackedImageContainerView: 0x7f9404604630; frame = (0 0; 308 308); layer = <_UIStackedImageContainerLayer: 0x7f94046047d0>>
(lldb) po [0x7f9404604630 _whyIsThisViewNotFocusable]
ISSUE: This view returns NO from -canBecomeFocused.
ISSUE: One or more ancestors have issues that may be preventing this view from being focusable. Details: 

    <StationCollectionViewCell 0x7f940434c6c0>:
        ISSUE: This view returns YES from -canBecomeFocused, which will prevent its subviews from being focusable.

    <StationSectionCollectionViewCell 0x7f940403e8e0>:
        ISSUE: This view returns YES from -canBecomeFocused, which will prevent its subviews from being focusable.

【讨论】:

这应该是公认的答案。尽管焦点问题的细节可能会有所不同,但这是调试此类问题的正确方法,并且我已经了解了有关可视层次结构视图的一些新知识。【参考方案2】:

在 Swift 中

如果你想聚焦collection view Cell 那么你可以使用collectionview Delegate方法,方法名是

func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 


你可以像这样使用这个方法...

func collectionView(collectionView: UICollectionView, didUpdateFocusInContext context: UICollectionViewFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 

if let previousIndexPath = context.previouslyFocusedIndexPath,
let cell = collectionView.cellForItemAtIndexPath(previousIndexPath) 
cell.contentView.layer.borderWidth = 0.0
cell.contentView.layer.shadowRadius = 0.0
cell.contentView.layer.shadowOpacity = 0


if let indexPath = context.nextFocusedIndexPath,
let cell = collectionView.cellForItemAtIndexPath(indexPath) 
cell.contentView.layer.borderWidth = 8.0
cell.contentView.layer.borderColor = UIColor.blackColor().CGColor
cell.contentView.layer.shadowColor = UIColor.blackColor().CGColor
cell.contentView.layer.shadowRadius = 10.0
cell.contentView.layer.shadowOpacity = 0.9
cell.contentView.layer.shadowOffset = CGSize(width: 0, height: 0)
collectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: [.CenteredHorizontally, .CenteredVertically], animated: true)

 

【讨论】:

以上是关于无法将焦点移动到 tvOS 中的下一个 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionView 水平滚动与静态焦点项目

将焦点移到键 Enter 上的下一个控件

如何在 tvOS 中对按钮焦点执行动作事件

如何将焦点转移到select2中的下一个元素

在 tvos 中更改焦点时如何关闭 UISearchController 中的键盘?

TVOS 10 SpriteKit 焦点导航默认焦点项目