无法将焦点移动到 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的主要内容,如果未能解决你的问题,请参考以下文章