防止关注tvOS

时间:2015-12-18 23:02:25

标签: focus selection uisegmentedcontrol tvos

我正在开发一个关于tvOS应用程序的简单用户界面,我遇到了一个奇怪的问题。

UISegmentedControl聚焦时,您可以移动焦点并自动更改所选片段。但我正在寻找的是一种仅在用户点击片段时限制片段选择的方法,而不是在他关注片段时。

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:0)

您需要为选定的片段设置自己的内部变量,并且仅在按下选择按钮时更改其值(您可以使用手势识别器获取)。当段失去焦点(在didUpdateFocus函数中可检测到)时,您将内部变量的值分配给段控件的选定索引。

答案 1 :(得分:0)

您需要继承UISegmentedControl,然后覆盖didUpdateFocusInContext。在IB的“自定义类”字段中,使用自定义类的名称。

答案 2 :(得分:0)

您可以通过定义以下内容来继承UISegmentedControl并禁用其行为:

@objc func _selectFocusedSegment(){
    print ("select focused segment")
}

请注意,此解决方案是黑客。据我所知,没有什么好的,干净的方法可以完成您想要的工作,而无需理会UISegmentedControl。

还知道,当UISegmentedControl在段之间“更改焦点”时,它实际上并没有更改焦点。因此,像Nostradamus那样关注焦点更新建议是行不通的。对于焦点引擎,UISegmentedControl的行为类似于单个大型可聚焦元素,而不像一组可聚焦段。您可以通过调试检查UIFocusUpdateContext专注于朝向或远离UISegmentedControl来亲自查看。

我偶然通过定义UISegmentedControl子类并调试记录了各种NSObject.perform方法以及其他方法,来到了_selectFocusedSegment。我的意图是对UISegmentedControl如何保留粘性的,最后聚焦的项目进行反向工程,这在Apple TV上很难做到。我无法确切找到UISegmentedControl如何管理焦点,但是一路走来都能找到您问题的答案。

相关问题