当collectionview中的第一个单元格聚焦时无法聚焦uibutton

Posted

技术标签:

【中文标题】当collectionview中的第一个单元格聚焦时无法聚焦uibutton【英文标题】:cannot focus uibutton when first cell in collectionview is focused 【发布时间】:2016-01-14 14:37:33 【问题描述】:

我目前正在开发一款 Apple TV 应用。 我的视图是这样从左到右构建的(另见屏幕截图)

UICollectionView UIImageview UIView UILabels UIButton

当我在第二个uicollectionviewCell时,我只能将UIButton聚焦在右侧。

当我在第一个和第三个单元格时,我无法将焦点转移到 UIButton

有什么帮助吗?

编辑

我的ViewDidLoad中有这个代码

view.addLayoutGuide(focusGuide)

    focusGuide.leftAnchor.constraintEqualToAnchor(collectionView.leftAnchor).active = true
    focusGuide.topAnchor.constraintEqualToAnchor(collectionView.topAnchor).active = true
    focusGuide.widthAnchor.constraintEqualToAnchor(view.widthAnchor).active = true
    focusGuide.heightAnchor.constraintEqualToAnchor(view.heightAnchor).active = true

并添加了这个方法:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 
        super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator)

        guard let nextFocusedView = context.nextFocusedView else  return 

        switch nextFocusedView 
        case self.collectionView:
            self.focusGuide.preferredFocusedView = self.orderButton

        case self.orderButton:
            self.focusGuide.preferredFocusedView = self.collectionView

        default:
            self.focusGuide.preferredFocusedView = nil
        
    

【问题讨论】:

您将不得不提供有关您的代码的更多信息。您要求我们通过猜测代码中可能存在的内容来诊断代码中的某些错误。 您好,您需要哪部分代码? 您好,您是否按照documentation site 上的所有信息和说明进行操作? (例如按钮是否被禁用?所有方法都实现了吗?) UIFocusGuide @PetahChristian 我正在为这个 UIFocusGuide 苦苦挣扎一段时间...... 【参考方案1】:

您应该仔细检查您在collectionview 的collecionviewcell 中关于UIFocusEngine 委托调用的代码。

1) 将每个collectionview 作为一个自定义视图,以UIView 作为父类,遵循Apple 开发文档中的指南,如下所示 支持自定义视图中的焦点

与 UIViewController 一样,UIView 也符合 UIFocusEnvironment,这意味着在视图控制器中支持焦点中概述的所有内容也适用于自定义视图。但是,由于视图可以聚焦,因此在实现自定义视图焦点行为时需要考虑一些额外的注意事项:

如果您的自定义视图需要可聚焦,请覆盖 canBecomeFocused 以返回 YES(默认情况下,它返回 NO)。 您的视图可能始终是可聚焦的或只能有条件地聚焦。例如,UIButton 对象在禁用时是不可聚焦的。 如果聚焦此视图应将焦点重定向到另一个视图(例如,子视图),则可选择覆盖 preferredFocusedView。 覆盖 didUpdateFocusInContext:withAnimationCoordinator: 以在焦点更新发生时响应它们并更新应用的内部状态。

2) 在collectionview的焦点相关委托方法中,处理焦点更新到另一个单元格的情况,您希望通知UIFocusEngine正确更新新单元格中的上下文。

当您使用集合视图和表视图时,您使用委托对象 > 来定义任何自定义行为。在实现基于 >focus 的界面时也会使用此模式。 UITableViewDelegate 和 UICollectionViewDelegate >protocols 声明的方法和属性类似于 >UIFocusEnvironment 协议提供的方法和属性,但用于表视图和集合视图行为。

在集合视图和表格视图中支持焦点的提示:

使用 UICollectionViewDelegate 类的 collectionView:canFocusItemAtIndexPath: 方法或 UITableViewDelegate 类的 tableView:canFocusRowAtIndexPath: 方法来指定特定单元格是否应该是可聚焦的。此操作的工作方式类似于在自定义视图中覆盖 UIView 方法的 canBecomeFocused。 使用在 UICollectionView 和 UITableView 中定义的 remembersLastFocusedIndexPath 属性来指定当焦点离开然后重新进入集合视图或表格视图时,焦点是否应该返回到最后一个焦点索引路径。

https://developer.apple.com/library/tvos/documentation/General/Conceptual/AppleTV_PG/WorkingwiththeAppleTVRemote.html#//apple_ref/doc/uid/TP40015241-CH5-SW2 有更多内容可供阅读

【讨论】:

【参考方案2】:

我只能猜测,因为我还没有在 AppleTV 上工作,但据我了解您在做什么,您无法从收藏视图的第一个单元格中聚焦按钮。我的猜测是,您没有明确告诉系统应该从特定元素中获得焦点。系统“看到”您要聚焦的按钮距离垂直轴上的第一个单元格太远。由于第二个单元更近,系统允许它移动。

正如我所说,这只是我从 Unity3D 中学到的关于 GUI 元素之间自动链接的猜测,我可能完全错了,但这看起来真的很像我对我说的。

【讨论】:

【参考方案3】:

您可以尝试以下方法吗?

    focusGuide.leftAnchor.constraintEqualToAnchor(imageView.leftAnchor).active = true
    focusGuide.rightAnchor.constraintEqualToAnchor(imageView.rightAnchor).active = true
    focusGuide.topAnchor.constraintEqualToAnchor(imageView. topAnchor).active = true
    focusGuide.bottomAnchor.constraintEqualToAnchor(imageView.bottomAnchor).active = true

【讨论】:

以上是关于当collectionview中的第一个单元格聚焦时无法聚焦uibutton的主要内容,如果未能解决你的问题,请参考以下文章

当单元格具有动态宽度时,CollectionView 中的间距不正确?

如何通过CollectionView中的Flow Layout将单元格对齐到顶部

不同笔尖的collectionView单元格宽度不会改变

如何将手势识别器添加到collectionview单元格中的uiview

CollectionView 单元格出现在 collectionView 之外。

如何使单元格与 CollectionView 中的页脚部分重叠?