【问题标题】:Apple TV - how to implement a sticky focus selection like in UISegmentedControl?Apple TV - 如何在 UISegmentedControl 中实现粘性焦点选择?
【发布时间】:2019-10-29 23:52:55
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ios uikit focus tvos apple-tv


    【解决方案1】:

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

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

    需要注意的是,如果容器的子视图填满了容器,则会命中子视图而不是容器周围的焦点指南。所以总的来说,我有:

        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!]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多