苹果读屏技术--VoiceOver

苹果读屏技术–VoiceOver
一、系统VoiceOver使用简介

iPhone上开启VoiceOver功能后,就可以通过手势来操作当前界面中的所有的AccessibilityElement(被VoiceOver访问的UI元素),当点击一个AccessibilityElement,如果当前AccessibilityElement是label时,VoiceOver会将AccessibilityElement的信息读出来。

二、概念

AccessibilityElement

指可以被VoiceOver访问的UI元素,UIKit中的控件基本都支持VoiceOver,除了UIView,不过也可以通过设置UIView的isAccessibilityElement属性来控制某个View是否是AccessibilityElement,在UIKit的控件中,像UILabel,UIButton这些控件的isAccessibilityElement属性默认就是YES,UIView这个属性默认是NO。

三、开发支持VoiceOver

######1、UIAccessibility及相关类

  • UIAccessibility(Informal Protocol):实现UIAccessibility协议的对象报告其可访问性状态(即是否可访问),并提供有关其自身的描述性信息。 默认情况下,标准的UIKit控件和视图实现了UIAccessibility协议,障碍类型的app可以将这些控件展现给视力障碍用户。但是自定义的内容需要重写UIAccessibility ,根据需要支持某些设置即可。例如,我们的自定义UIImageView 子类可能需要覆盖accessibilityLabel,但它不需要覆盖accessibilityFrame。

  • UIAccessibilityContainer(Informal Protocol):该协议一般用于UIView的子类,可以让它所包含的一些子UI作为单独的元素被访问到。当一个视图所包含的子对象并不是UIView的子类,而又需要被访问到的时候,这个协议就非常有用。

  • UIAccessibilityElement(Class):这个类默认实现了UIAccessibility协议,可以为一个不能被自动访问到的对象(例如非UIView的子类)创建一个该类的实例,从而让它可以被访问到

2、正确使用UIAccessibility
  • 标准的UIKit controls和views都是自动无障碍的,所以只需要确保它们默认提供的无障碍信息是否准确。

  • 自定义的view或控件,需要自己实现它的无障碍配置,这种情况又可以分为以下两种:

    • an individual view:自定义view里面不包含任何子元素

      //方式一:直接给isAccessibilityElement属性赋值,标识为无障碍原色
      view.isAccessibilityElement = YES
      // 方式二:实现UIAccessibilityProtocol协议中的方法
      - (BOOL)isAccessibilityElement {
          return YES;
      }
      
    • a container view:自定义view里面包含其他子元素,那么这些子元素都需要做无障碍配置,容器视图本身不需要无障碍配置。

      //假定所有子元素都没有默认实现UIAccessibility协议,此时需要用到UIAccessibilityElement
      @implementation ContainerView
      - (NSArray *)accessibleElements {
         if ( _accessibleElements != nil ) {
            return _accessibleElements;
         }
         _accessibleElements = [[NSMutableArray alloc] init];
         // 每一个子元素都是一个UIAccessibilityElement,将他们全都添加到_accessibleElements中
         UIAccessibilityElement *element1 = [[[UIAccessibilityElement alloc] initWithAccessibilityContainer:self] autorelease];
         [_accessibleElements addObject:element1];
         UIAccessibilityElement *element2 = [[[UIAccessibilityElement alloc] initWithAccessibilityContainer:self] autorelease];
         [_accessibleElements addObject:element2];
         return _accessibleElements;
      }
      // 这个ContainerView是不支持Accessibility的
      - (BOOL)isAccessibilityElement {
         return NO;
      }
      // UIAccessibilityContainer协议方法
      - (NSInteger)accessibilityElementCount {
         return [[self accessibleElements] count];
      }
      - (id)accessibilityElementAtIndex:(NSInteger)index {
         return [[self accessibleElements] objectAtIndex:index];
      }
      - (NSInteger)indexOfAccessibilityElement:(id)element {
         return [[self accessibleElements] indexOfObject:element];
      }
      @end
      
3、Accessibility使用恰当合理
(1)确保Accessibility各属性的准确可靠

保证accessibilityLabel、accessibilityHint、accessibilityValue、accessibilityTraits设置的值,表达的信息准确可靠,我们分别看看这些属性

  • accessibilityLabel(标签)用于设置一个简单的词或短语描述控件或者视图,但是不能识别元素类型,例如“添加”、“播放”。

  • accessibilityHint(提示)用于设置一个简单的词或短语,描述发生在元素上动作的结果。例如“添加标题”或者“打开列表”。

  • accessibilityValue(值)指一个UI元素的内容,仅当元素的内容是可改变并且不能使用label描述时,一个无障碍元素才需要为其赋值。例如,一个进度条的标签可以是”播放进度”,但是它当前的值是“50%”。

  • accessibilityFrame(区域)定义辅助功能的区域和UI元素的位置,

  • accessibilityTraits,辅助功能特征,表征这个Element的特质,数据类型是一个枚举类型,可以通过按位或的方式合并多个特性,配置的traits的值,也会以语音的形式念出,例如设置UIAccessibilityTraitSelected | UIAccessibilityTraitImage | UIAccessibilityTraitButton会变成“已选定,图片,按钮”

    UIAccessibilityTraits UIAccessibilityTraitNone;//该无障碍元素无特性。

    UIAccessibilityTraits UIAccessibilityTraitButton;//该无障碍元素应该被当作一个按钮

    UIAccessibilityTraits UIAccessibilityTraitLink; //该无障碍元素应该被当作一个链接

    UIAccessibilityTraits UIAccessibilityTraitSearchField; //该无障碍元素为搜索区域

    UIAccessibilityTraits UIAccessibilityTraitImage; //该无障碍元素应该被当作一个链接,该特性可以与按钮或链接特性组合使用

    UIAccessibilityTraits UIAccessibilityTraitSelected; //该无障碍元素当前已被选定。
    使用该特性描述一个无障碍元素的特征,例如,在一个分段控件中,呈现已选定表行或已选定段

    UIAccessibilityTraits UIAccessibilityTraitPlaysSound; //该无障碍元素被激活时播放自己的声音

    UIAccessibilityTraits UIAccessibilityTraitKeyboardKey; //该无障碍元素的行为键盘键

    UIAccessibilityTraits UIAccessibilityTraitStaticText; //该无障碍元素应该被当作不能改变的静态文本

    UIAccessibilityTraits UIAccessibilityTraitSummaryElement; //当应用启动时,该无障碍元素提供摘要信息。使用该属性描述一个无障碍元素的特征,该元素提供当前情况、设置或状态的摘要,例如天气应用中的当前气温

    UIAccessibilityTraits UIAccessibilityTraitNotEnabled; //该无障碍元素不可用且不能响应用户交互

    UIAccessibilityTraits UIAccessibilityTraitUpdatesFrequently; //该无障碍元素频繁更新其标签或值。
    使用该特性描述一个无障碍元素的特征,该元素频繁更新其标签或值发送更新通知。当想要避免辅助应用处理不断的通知时,和当需要更新信息而轮询改变时,包含该特性。例如,开发者可以使用该属性描述秒表朗读的特征

    UIAccessibilityTraits UIAccessibilityTraitStartsMediaSession; //当该无障碍元素被激活时,启动一个媒体对话。
    使用该特性关闭辅助应用的音频输出,例如VoiceOver。在媒体会话期间,媒体会话不应该被打断。例如,当用户录制音频的时候,开发者可以使用该属性静音VoiceOver

    UIAccessibilityTraits UIAccessibilityTraitAdjustable; //该无障碍元素的值在一定范围内允许持续调整。
    使用该属性描述一个无障碍元素的特征,用户可以使用持续的行为调整该元素,例如滑块或选择器视图。如果为一个无障碍元素指定了该特性,开发者同时应该在UIAccessibilityAction协议中实现accessibilityIncrement和accessibility Decrement方法

    UIAccessibilityTraits UIAccessibilityTraitAllowsDirectInteraction; //该无障碍元素允许VoiceOver用户直接触摸交互。使用该特性描述一个无障碍元素的特征,该元素呈现的对象用户可以直接交互,例如呈现钢琴键盘的视图

    UIAccessibilityTraits UIAccessibilityTraitCausesPageTurn; //该无障碍元素应该引起自动翻页,当VoiceOver阅读完成当页的文本时。使用该特性描述一个无障碍元素的特征,该元素在一系列页面内容中呈现一个页面,例如呈现一本书中的一页。当VoiceOver阅读完成当前页面的内容,调用具有UIAccessibilityScrollDirectionNext属性的accessibilityScroll方法滚动到下一内容页。如果VoiceOver检测到当前页面与先前的页面无差异,停止滚动

    UIAccessibilityTraits UIAccessibilityTraitHeader;//该无障碍元素是一个将内容划分为章节的标题,例如导航栏的标题

  • isAccessibilityElement 设置是否支持盲人模式,isAccessibilityElement默认是false,UIKit默认打开,但是UIImageView需要单独打开.

  • accessibilityElementHidden 不在读取该元素.isAccessbilityElement为NO值只读取label,如果将accessibilityElementHidden设为YES,lable也不再读取.

(2)相关事件Actions

  • Activate 单指轻点两次. 表示激活控件,如按钮点击

  • Escape. 单指 Z-shaped 手势一般用于退出模态界面或者返回导航的上一页界面

  • Magic Tap. 双指轻点两次触发 most-intended action.

  • Three-Finger Scroll. 触发水平滚动,如UIScrollView

  • Increment. 单指向上滑动,需要设置accessibilityTraits为UIAccessibilityTraitAdjustable,否则对应的方法不会被调用

  • Decrement. 单指向下滑动,需要设置accessibilityTraits为UIAccessibilityTraitAdjustable,否则对应的方法不会被调用

(3)主动设置

  • 设置焦点元素

    UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, element)

  • 直接读出一段文字

     void UIAccessibilityPostNotification(UIAccessibilityNotifications notification, __nullable id argument)
     
     例如
     UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"read me");
    
  • 是否开启了盲人模式

    BOOL UIAccessibilityIsVoiceOverRunning(void)

  • 监听盲人模式状态改变

    通知名称为:UIAccessibilityVoiceOverStatusChanged

读屏官方文档

https://developer.apple.com/library/archive/documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008785-CH1-SW1

Accessibility Inspector介绍

https://www.raywenderlich.com/6827616-ios-accessibility-getting-started

http://www.cocoachina.com/articles/24250

优秀的相关博客

https://blog.csdn.net/heyc861221/article/details/80125550

https://zhuanlan.zhihu.com/p/22776897

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值