ios - Apple TV - 如何实现像 UISegmentedControl 中那样的粘性焦点选择?

标签 ios uikit focus tvos apple-tv

在自定义控件中,如何实现 UISegmentedControl、UITabBar、UITableView 或 UICollectionView 中所示的粘性焦点选择?我所说的“粘性选择”是指当聚焦到容器时自动将焦点转移到最后一个聚焦/选定的项目。

UISegmentedControl +其他人如何自己实现这个?我尝试检查 UISegmentedControl 并惊讶地发现它是一个大型可聚焦元素,而不是一组可聚焦片段。我无法找出 UISegmentedControl 如何在给定其架构的段之间切换焦点。

到目前为止,我的解决方法是:

在屏幕级别,维护每个粘性选择。例如,如果屏幕有两个自定义顶部菜单,则屏幕保留两个事件选择。重写 shouldUpdateFocus 以检测焦点更改到具有粘性选择的容器/菜单中。返回 false + 调用 setNeedsFocusUpdate 并结合覆盖 PreferredFocusEnvironments 将焦点重定向到粘性/选定的 subview 。

我的解决方案有效,但对于编写自动维护粘性选择的可重用自定义 UI 来说并不令人满意。 Apple 能够制作几个这样的自定义 UI,所以肯定有一些我缺少的方法。

最佳答案

我找到了一种适用于可重用控件的方法:

将控件包围在 UIFocusGuide 中。然后只需使用 UIFocusGuide.preferredEnvironments 来确定当焦点转移到容器时哪个 subview 接收焦点。

需要注意的是,如果容器的 subview 填充了容器,则将命中 subview 而不是容器周围的焦点引导线。总的来说,我有:

    self.focusGuide = UIFocusGuide()
    let focusGuideExpansion: CGFloat = 1
    self.addLayoutGuide(focusGuide)
    focusGuide.leadingAnchor.constraint(equalTo:self.leadingAnchor, constant:-focusGuideExpansion).isActive = true
    focusGuide.trailingAnchor.constraint(equalTo:self.trailingAnchor, constant:focusGuideExpansion).isActive = true
    focusGuide.topAnchor.constraint(equalTo:self.topAnchor, constant:-focusGuideExpansion).isActive = true
    focusGuide.bottomAnchor.constraint(equalTo:self.bottomAnchor, constant:focusGuideExpansion).isActive = true

    // default to focusing on the first subview
    focusGuide.preferredFocusEnvironments = [subviews.first!]

关于ios - Apple TV - 如何实现像 UISegmentedControl 中那样的粘性焦点选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58616930/

相关文章:

iphone - UIImageView autoresizingMask 行为

javascript - 如果用户在文本区域内按下 Enter 键,如何获取 html 元素 id

python - 如何阻止 gtk.Entry 失去对箭头按键的关注?

objective-c - 更改 UIStepper 的外观

ios - 如何在 Swift 中设置 Google 跟踪代码管理器

objective-c - 重复使用时如何完全清除单元格?

html - 无法确定是否选中了单选按钮

widget - Flutter - 将焦点转移到特定的小部件

iphone - UISlider 拇指停止拖动

android - Flash Air 与 iOS 和 Android 的兼容性