区块链技术博客
www.b2bchain.cn

WWCD 10116 – VoiceOver efficiency with custom rotors求职学习资料

本文介绍了WWCD 10116 – VoiceOver efficiency with custom rotors求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

概览

本session主要讲述在VoiceOver引入了新的转盘组件(rotors)后,开发者开发app时通过使用并自定义该组件将会极大的提升视力障碍的用户的应用使用体验。

正文:

在开启VoiceOver后,只要用两手轻轻转动便可呼出rotors,此时向上或向下滑动将分别返回屏幕上的上一个rotor对象,或是切换到屏幕上的下一个rotor对象。通过向app引入自定义的rotors对象,将会令复杂视图下的导览变得更加方便,寻找与当前对象相关联的对象只需要上下滑动便可。

DEMO1:

本demo主要展示了地图app是如何使用自定义的rotors的
假设我们现在正在开发一个地图app,这个地图app不仅会显示我们自己的位置,同时也会显示附近的apple store和公园的位置。
WWCD 10116 - VoiceOver efficiency with custom rotors
如果我们使用的是没有任何自定义设置的VoiceOver,显然针对上图的情况,它会从上至依次朗读屏幕中的内容。
思考一下,对于视力正常的使用者在此时的注意点会放在哪里呢,显然他的注意力会从大到小的分散到由近及远的Apple Store和Park中。
于是我们尝试通过将这些地点进行按类型的分类和按距离的排序,来令视力障碍使用者能达到相同的体验。

WWCD 10116 - VoiceOver efficiency with custom rotors WWCD 10116 - VoiceOver efficiency with custom rotors

左图为将地图app抽象后的示意图,我们通过将地点分类并移去我们不希望视力障碍用户关注的内容便可得到右侧的图。
其中上下两行分别代表两种rotors对象,通过两指在屏幕上转动便可轻松的切换类别,向上或者向下滑动则可切换到当前类别中的前一个或后一个对象。
通过ios14的实际尝试以及demo中所给出的代码,每个rotor其实相当于一个双向链表的节点,这些节点将屏幕中的所有的开发者希望VoiceOver能进行朗读的元素串接起来。开发者唯一所需要做的,便是定义每个节点的类别的名称,该节点的前驱节点以及后继节点,以及该节点所包含的元素。
以下是向该demo添加rotors的代码示例
首先定义的是返回rotor实例的函数

func customRotor(for poiType: POI) -> UIAccessibilityCustomRotor {     UIAccesibilityCustomRotor(name: poiType.rotorName) { [unowned self] predicate in         let currentElement = predicate.currentItem.targetElement as? MKAnnotationView         let annotations = self.annotationViews(for: poiType)         let currentIndex = annotations.firstIndex { $0 == currentElement }         let targetIndex: Int         switch predicate.searchDirection {         case .previous              targetIndex = (currentIndex ?? 1) - 1         case .next             targetIndex = (currentIndex ?? -1) + 1         guard 0..<annotations.count ~= targetIndex else { return nil }         return UIAccessibilityCustomRotorItemResult(targetElement: annotations[targetIndex], targetRange: nil)     } }

其中POI为存储地点类型的属性,通过函数annotationViews(for: poitype)可以拿到该poitype所对应的保存有MKAnnotainView实例的数组,这个数组按距离从近到远存储着当前poiType所对应的全部位置的信息。
其中7到12行定义的是当前rotor的前驱和后继对象,第12行中当发现rotor节点已经到了整个双向链表的最前端或最后端则直接返回nil,告知设备无法进行本次切换操作。
向当前的mapView中添加对应的rotors实例也非常简单,只需要如下的一行代码

概览

本session主要讲述在VoiceOver引入了新的转盘组件(rotors)后,开发者开发app时通过使用并自定义该组件将会极大的提升视力障碍的用户的应用使用体验。

正文:

在开启VoiceOver后,只要用两手轻轻转动便可呼出rotors,此时向上或向下滑动将分别返回屏幕上的上一个rotor对象,或是切换到屏幕上的下一个rotor对象。通过向app引入自定义的rotors对象,将会令复杂视图下的导览变得更加方便,寻找与当前对象相关联的对象只需要上下滑动便可。

DEMO1:

本demo主要展示了地图app是如何使用自定义的rotors的
假设我们现在正在开发一个地图app,这个地图app不仅会显示我们自己的位置,同时也会显示附近的apple store和公园的位置。
WWCD 10116 - VoiceOver efficiency with custom rotors
如果我们使用的是没有任何自定义设置的VoiceOver,显然针对上图的情况,它会从上至依次朗读屏幕中的内容。
思考一下,对于视力正常的使用者在此时的注意点会放在哪里呢,显然他的注意力会从大到小的分散到由近及远的Apple Store和Park中。
于是我们尝试通过将这些地点进行按类型的分类和按距离的排序,来令视力障碍使用者能达到相同的体验。

WWCD 10116 - VoiceOver efficiency with custom rotors WWCD 10116 - VoiceOver efficiency with custom rotors

左图为将地图app抽象后的示意图,我们通过将地点分类并移去我们不希望视力障碍用户关注的内容便可得到右侧的图。
其中上下两行分别代表两种rotors对象,通过两指在屏幕上转动便可轻松的切换类别,向上或者向下滑动则可切换到当前类别中的前一个或后一个对象。
通过ios14的实际尝试以及demo中所给出的代码,每个rotor其实相当于一个双向链表的节点,这些节点将屏幕中的所有的开发者希望VoiceOver能进行朗读的元素串接起来。开发者唯一所需要做的,便是定义每个节点的类别的名称,该节点的前驱节点以及后继节点,以及该节点所包含的元素。
以下是向该demo添加rotors的代码示例
首先定义的是返回rotor实例的函数

func customRotor(for poiType: POI) -> UIAccessibilityCustomRotor {     UIAccesibilityCustomRotor(name: poiType.rotorName) { [unowned self] predicate in         let currentElement = predicate.currentItem.targetElement as? MKAnnotationView         let annotations = self.annotationViews(for: poiType)         let currentIndex = annotations.firstIndex { $0 == currentElement }         let targetIndex: Int         switch predicate.searchDirection {         case .previous              targetIndex = (currentIndex ?? 1) - 1         case .next             targetIndex = (currentIndex ?? -1) + 1         guard 0..<annotations.count ~= targetIndex else { return nil }         return UIAccessibilityCustomRotorItemResult(targetElement: annotations[targetIndex], targetRange: nil)     } }

其中POI为存储地点类型的属性,通过函数annotationViews(for: poitype)可以拿到该poitype所对应的保存有MKAnnotainView实例的数组,这个数组按距离从近到远存储着当前poiType所对应的全部位置的信息。
其中7到12行定义的是当前rotor的前驱和后继对象,第12行中当发现rotor节点已经到了整个双向链表的最前端或最后端则直接返回nil,告知设备无法进行本次切换操作。
向当前的mapView中添加对应的rotors实例也非常简单,只需要如下的一行代码

概览

本session主要讲述在VoiceOver引入了新的转盘组件(rotors)后,开发者开发app时通过使用并自定义该组件将会极大的提升视力障碍的用户的应用使用体验。

正文:

在开启VoiceOver后,只要用两手轻轻转动便可呼出rotors,此时向上或向下滑动将分别返回屏幕上的上一个rotor对象,或是切换到屏幕上的下一个rotor对象。通过向app引入自定义的rotors对象,将会令复杂视图下的导览变得更加方便,寻找与当前对象相关联的对象只需要上下滑动便可。

DEMO1:

本demo主要展示了地图app是如何使用自定义的rotors的
假设我们现在正在开发一个地图app,这个地图app不仅会显示我们自己的位置,同时也会显示附近的apple store和公园的位置。
WWCD 10116 - VoiceOver efficiency with custom rotors
如果我们使用的是没有任何自定义设置的VoiceOver,显然针对上图的情况,它会从上至依次朗读屏幕中的内容。
思考一下,对于视力正常的使用者在此时的注意点会放在哪里呢,显然他的注意力会从大到小的分散到由近及远的Apple Store和Park中。
于是我们尝试通过将这些地点进行按类型的分类和按距离的排序,来令视力障碍使用者能达到相同的体验。

WWCD 10116 - VoiceOver efficiency with custom rotors WWCD 10116 - VoiceOver efficiency with custom rotors

左图为将地图app抽象后的示意图,我们通过将地点分类并移去我们不希望视力障碍用户关注的内容便可得到右侧的图。
其中上下两行分别代表两种rotors对象,通过两指在屏幕上转动便可轻松的切换类别,向上或者向下滑动则可切换到当前类别中的前一个或后一个对象。
通过ios14的实际尝试以及demo中所给出的代码,每个rotor其实相当于一个双向链表的节点,这些节点将屏幕中的所有的开发者希望VoiceOver能进行朗读的元素串接起来。开发者唯一所需要做的,便是定义每个节点的类别的名称,该节点的前驱节点以及后继节点,以及该节点所包含的元素。
以下是向该demo添加rotors的代码示例
首先定义的是返回rotor实例的函数

func customRotor(for poiType: POI) -> UIAccessibilityCustomRotor {     UIAccesibilityCustomRotor(name: poiType.rotorName) { [unowned self] predicate in         let currentElement = predicate.currentItem.targetElement as? MKAnnotationView         let annotations = self.annotationViews(for: poiType)         let currentIndex = annotations.firstIndex { $0 == currentElement }         let targetIndex: Int         switch predicate.searchDirection {         case .previous              targetIndex = (currentIndex ?? 1) - 1         case .next             targetIndex = (currentIndex ?? -1) + 1         guard 0..<annotations.count ~= targetIndex else { return nil }         return UIAccessibilityCustomRotorItemResult(targetElement: annotations[targetIndex], targetRange: nil)     } }

其中POI为存储地点类型的属性,通过函数annotationViews(for: poitype)可以拿到该poitype所对应的保存有MKAnnotainView实例的数组,这个数组按距离从近到远存储着当前poiType所对应的全部位置的信息。
其中7到12行定义的是当前rotor的前驱和后继对象,第12行中当发现rotor节点已经到了整个双向链表的最前端或最后端则直接返回nil,告知设备无法进行本次切换操作。
向当前的mapView中添加对应的rotors实例也非常简单,只需要如下的一行代码

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WWCD 10116 – VoiceOver efficiency with custom rotors求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们