VoiceOver

介绍

1.开启voiceOver

设置->通用->辅助功能->VoiceOver

在voiceOver模式中

a.轻触一次是选中控件

b.双击激活

c.三只手指滚动视图

2.效果

当用户在选择了指定交互元素的时候,VoiceOver “说”给用户听这个元素 的信息和使用提示,而这个元素的辅助功能标签和提示告诉 VoiceOver 应该如何“说”给用户听。

比如 当你 轻触导航栏中的“返回”按钮,voiceOver会告诉你  "返回 按钮";在官网提供的VoiceOver介绍中有张图进行了介绍


voiceover图片示例

3.UIAccessibility属性说明

label(标签)一个简短的本地化词或短语,此短语简洁地描述控件或者视图,但是不能识别元素类型。例如“添加”、“播放”。

traits(特性)一个或多个独立特征的组合。每个特征描述一个元素状态、行为、使用中的某一方面。例如当元素的行为如同被选中键盘上的按键,这个元素就有了Keyboard Key和Selected的组合特征。

hint(提示)一个简短的本地化短语,描述发生在元素上动作的结果。例如“添加标题”或者“打开购物列表”。

frame(框架)元素在屏幕上坐标的框架。由CGRect结构体提供,详细说明了元素的屏幕位置和大小。

value(值)不是由标签定义的元素时的当前值。例如,一个幻灯片的标签可以是”速度”,但是它当前的值是“50%”

tips:

1) UIAccessibilityElement都必须有frame和label属性

2) 仅当元素的内容是可改变并且永不被label描述时,一个无障碍元素才需要提供给值属性提供内容。例如,一个文本域包含了一个可能有Email标签的Email地址,但是它的内容取决于用户的输入,通常格式为”username@address。“value提供了一个动态更新的方式

3)voiceOver朗读的顺序  label->traits->hint

实现细节

4.UI Accessibility编程接口

UIAccessibility (informal protocol)实现UIAccessibility协议的对象可以报告无障碍状态(即他们是否是无障碍的)并且提供关于自身的描述信息。UIAccessibility协议默认由标准UIKit控件和视图都有实现,比如说某些UIView子类、UIButton,UILabel都默认实现了,voiceOver可以朗读其信息,可以自定义其属性VoiceOver朗读的信息

UIAccessibilityContainer(informal protocol)

当非UIView子类的对象被UIView视图包含时,这些元素不会自动变成无障碍元素,此时UIAccessibilityContainer协议就非常有用。

UIAccessibilityElement(class)

定义了一个对象是否能通过UIAccessibilityContainer协议返回。你可以创建UIAccessibilityElement实例来代表无法自动变为无障碍的元素,例如一个没有继承自UIView的对象,或者一个不存在的对象。

UIAccessibilityConstants.h (header file)

此头文件定义了用来描述某些特征的常量。这些常量即 可展示的无障碍元素,还有可被应用发布的通知。

5.模拟器中使用VoiceOver

在xcode编程,模拟器打开VoiceOver后,可以看到


模拟器打开Accessibility

其中Accessibility Inspector是展示元素的可用性,

Label 对应 accessibilityLabel属性,控件信息,触摸时首先被朗读的

Traits 对应 accessibilityTraits属性,控件类型和特征,比如说 按钮、变灰

Frame 对应 accessibilityFrame属性 ,朗读时在屏幕上显示的聚焦框位置和大小,一般不需改动。

可以通过编写代码

button.accessibilityLabel = @"请点击一下";

button.accessibilityHint = @"可以进入到新页面";

可以得到结果,voiceOver信息就会变成请点击一下  按钮    可以进入到新页面


模拟器点击按钮accessibility内容


6.针对几种元素进行VoiceOver开发

(1)标准控件

标准控件默认支持VoiceOver,只需要通过UIAccessibility接口设置对应的属性就可以达到大部分的无障碍支持需求,用的比较多的属性有:

accessibilityLabel:此属性用于描述控件的功能或内容,当用户触摸到控件区域,就会播放相应的描述内容;accessibilityTraits:UIAccessibilityTraits,用于描述控件的特性,是一个组合属性,即可以通过多个UIAccessibilityTraits或操作组合属性。对于标准控件,都有其默认值描述对应控件的特征,而自定义控件的默认值为UIAccessibilityTraitNone,举个例子,UIButton该属性默认值为UIAccessibilityTraitButton,当用户触摸时将会播放accessibilityLabel的描述内容+“按钮”,如果按钮被disable,则应该像如下设置此属性,表示该元素 是 按钮且变灰(点击无效)

stopElement.accessibilityTraits = UIAccessibilityTraitButton | UIAccessibilityTraitNotEnabled;

accessibilityHint:用于描述控件激活后的动作,一般是一个动词开头的短语;

accessibilityElementsHidden:是一个BOOL属性,用于隐藏控件,使控件不响应VoiceOver触摸,设置控件的hidden属性只能隐藏控件的可视区域,但是对VoiceOver是无效的,如果要使控件不响应VoiceOver,将此属性设置为YES.

(2)自定义控件(UIView的某些子类)

默认情况下自定义控件是不支持VoiceOver的。可以通过两种方式使其支持VoiceOver:

1)实现isAccessibilityElement协议,在UIView子类中实现此协议返回YES;

2)直接设置isAccessibilityElement属性,将其设置为YES; 自定义其他属性和标准控件一样

tips:

a.父View如果设置isAccessibilityElement为YES,则其子View将都不能相应VoiceOver,如果如果需要两个View都支持VoiceOver,只能改变他们的层次结构,并都设置为isAccessibilityElement.

b.在某些情况下,希望控件在VoiceOver模式下直接处理touch事件,比如,画图功能,画布需要处理触摸事件,而在voiceOver开启的情况下,touch事件会被block,这时就需要设置画布的accessibilityTraits: paintCanvas.accessibilityTraits |= UIAccessibilityTraitAllowsDirectInteraction;

(3)其他情况

在自定义view中有时包含了一些非标准控件也非UIView子类的可触摸UI原素,比如通过draw方法画出来的区域,则以上的两种情况都不能实现无障碍体验,这种情况下,则需要实现UIAccessibilityContainer Protocol来实现.UIAccessibilityContainer Protocol是非正式协议,只需要实现以下接口:

1)定义一个NSMutableArray属性 用于保存所有的accessible Elements. @property(nonatomic, strong) NSMutableArray *accessibleElements;

2)– (NSInteger)accessibilityElementCount方法,返回Element个数;

3)– (id)accessibilityElementAtIndex:(NSInteger)index;返回对应index下的UIAccessibilityElement;

4)实现- (bool)isAccessibilityElement;返回NO,正如之前提到,父View如果为AccessibilityElement,子element将不响应voiceover,所以这里要返回NO; 在生成每个区域的UIAccessibleElement需要定义element关联的frame,,其它的和标准控件一致,举例子(在官网中也有例子说明),比如如下这段:

UIAccessibilityElement *element = [[UIAccessibilityElement alloc]initWithAccessibilityContainer:self];

element.accessibilityFrame = [self convertRect:_nameLabel.frame toView:nil];

element.accessibilityLabel = NSLocalizedString( _nameLabel.text, nil);

element.accessibilityTraits = UIAccessibilityTraitStaticText;

[_accessibilityElements addObject:element];

(4)通知

1)在进入界面是将VoiceOver焦点定位到特定控件。可以使用UIAccessibilityPostNotification发送通知给特定控件,改变voiceOver焦点:

@implementation MyViewController

- (void)viewDidAppear:(BOOL)animated

{

[super viewDidAppear:animated];

UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,

self.myFirstElement);

}

@end

2)直接播一段语音

UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @"something to read aloud");

(5)其他

长按在voiceOver下的操作:选中,轻点两下,再按住;解释见

http://www.applevis.com/forum/ios-ios-app-discussion/how-do-you-perform-long-press-action-using-voice-over

参考资料

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/iPhoneAccessibility/Introduction/Introduction.html

https://numbbbbb.gitbooks.io/ios-accessibility-programming-guide-in-chinese/content/ios_app/README.html(翻译版)

http://nshipster.cn/uiaccessibility/

http://useyourloaf.com/blog/voiceover-accessibility.html

http://bupojung.github.io/blog/2014/06/24/wei-mang-ren-dao-hang-voiceoverzong-jie/

voiceOver编程简介

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,796评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,066评论 4 62
  • 晨读感悟《学会花钱》0522 投资自己。下面全是干货,超干。 女生一定要看,不然看不出他给你下的套。 第一:高价值...
    周萍丶雷雨里的大少爷阅读 381评论 32 19
  • 它只是个日子, 如果非要, 让它变得有意义, 那, 就让它有意义吧! 我从不认为, 生活是索然无味的, 只是, 你...
    panjw阅读 251评论 0 3