转载

VoiceOver经验

VoiceOver是一个语音辅助软件,具备屏幕阅读器的功能,因此视障者及其他无法正常使用App的用户都可以通过VoiceOver来进行操作,位置在设置-通用-辅助功能-VoiceOver。

但是VoiceOver并不是万能的,并不能兼容开发者自定义的控件和视图,因此作为开发者,需要通过一些额外的工作让APP可以支持无障碍使用。

参考:

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

系统要求

>= iOS 3.0

VoiceOver基本手势操作

单指轻点:设置焦点

单指轻点两下:选中操作

三指左右轻扫:翻页(如果是不分page的网页或ScrollView,会自动按照屏幕显示区域分页查看)

单指左右轻扫:设置上一个/下一个元素为焦点

Accessibility属性介绍

一般来讲VoiceOver的目的是朗读屏幕的信息,那么下面列举的属性很重要,决定了界面元素可不可以朗读,读什么,类型如何etc

  • accessibilityLabel 一段文本,用来描述控件或者视图,但是不能识别元素类型。例如“添加”、“播放”。选中焦点时Label是第一段朗读的元素
  • accessibilityTraits 一个或多个独立特征的组合。每个特征描述一个元素状态、行为、或者类型。比如一个元素是键盘中被选中的某个键 ,这个元素就有了Keyboard Key和Selected的组合特征。有这些特征可以选择:按钮,连接,搜索框,键盘按键,图片,播放音乐,选择,总觉元素,频繁更新,不可用,空。 选中焦点时Traits 是第二段朗读的元素
  • accessibilityHint 一段文本,描述发生在元素上动作的结果或者补充说明。例如“用于添加标题”或者“点击这个按钮会打开购物列表”。 选中焦点时Hint 是第三段朗读的元素
  • accessibilityFrame 元素在屏幕上坐标的框架。由CGRect结构体提供,详细说明了元素的屏幕位置和大小。比如某些元素在界面中比较小或者不太好点击,可以为视觉障碍人士改变一下该元素的位置和大小,而不影响app的正常外观。
  • accessibilityValue 元素时的当前值。例如,一个幻灯片的标签可以是”速度”,但是它当前的值是“50%”。常用于滑动条
  • isAccessibilityElement 决定当前元素是不是一个VoiceOver支持元素,可以通过组合父视图和子视图的这个属性来控制焦点选择的区域,比如A父视图里面有很多子视图,如果A的isAccessibilityElement属性为YES,子视图属性为NO,那么焦点选择是A,换句话说A里面的子视图是设置不了焦点的,以A为整块级元素设焦点。反之,如果A的isAccessibilityElement为NO,那么A的subView可以逐个设置焦点,这点很像 userInteractionEnabled
  • accessibilityElementHidden 对视障人事来说,隐藏这个元素,点不到或者说点了没反应。与isAccessbilityElement的区别是 isAccessbilityElement 设为NO点击了依然会说出其Label,traits不会再读,而 accessibilityElementHidden 这个属性设置为YES后元素就完全就不能点,Labe或者traits都不会朗读,这点很像hidden

苹果推荐设置属性的方式如下图

VoiceOver经验

Accessibility属性经验

  1. 界面元素选中焦点时朗读顺序是:Label + Traits + Hint
  2. Label的文字如果是英文,用大写字母开头,VoiceOver会用恰当的语气来朗读
  3. Label的文字中间用逗号分隔,VoiceOver会自动在逗号处暂停一会儿再往下读
  4. 因为Traits已经在描述控件的类型,所以Label就不要再包含类型。比如Label为“添加按钮”,Traits为按钮,那选中焦点时就会读成“添加按钮按钮”,要避免这种情况发生
  5. 系统UIKit控件和视图一般都实现了基本的属性可以用于朗读,但是最好check一遍
  6. 自定义View视图需要自己实现基本属性用于朗读,最基本的就是isAccessibilityElement=YES,设置Label
  7. 双击焦点时只会朗读Label属性
  8. isAccessibilityElement属性为NO,元素在选中焦点的时候依然会朗读Label
  9. isAccessibilityElement属性可以用于控制父视图子视图的设置焦点区域
  10. isAccessibilityHidden属性可以让元素完全不可见
  11. UIKit控件默认支持AccessibilityTraits属性,比如UIButton的traits就是按钮,会自动朗读出来。自定义的View默认是 UIAccessibilityTraitNone,不会朗读
  12. 界面元素可以设置任何类型的AccessibilityTrait,没有限制,比如可以设置一个UILabel的trait为按钮类型 UIAccessibilityTraitButton
  13. 如果想让一个元素可以点击,但又不会被读出来(label,trait,hint都不想被朗读,一般对视障人士不需要这种需求),没有直接的属性可以设置,临时解决方案是Label,traits和Hint都设为空字符串
  14. 网页的VoiceOver需要前端同学遵循相关规范,比如  http://www.css3china.com/?p=906
  15. 在可以滚动的页面(如UIScrollView)中添加一些sub元素,如果这些sub元素只是UIKit控件,那么默认是可以单指左右滑动来切换元素的。但是如果其中有自定义的View,别忘了设置这个自定义view的isAccessibilityElement=YES,否则单指滑动时会跳过自定义元素
  16. xib是可以设置Accessibility属性的

Accessibility常用方法介绍

获取焦点:UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, element);

直接朗读文本:UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, @”something to read aloud”);

界面发生变化后朗读文本: UIAccessibilityPostNotification ( UIAccessibilityScreenChangedNotification @” 进入一个新的页面了,应该进行新的操作 );    

Accessibility常用方法经验

1.防止设置焦点的穿透:

一个灰色的蒙版和一个Picker,这时候设置焦点为picker,到这里都没问题。但是单指滑动的时候焦点居然可以投到灰色蒙版的下面去,会焦点选中蒙版下面的内容。这时候要给灰色蒙版层添加isAccessibilityElement=YES,焦点就不会穿透到下面了

2.关于TableViewCell的经验

一般来说,一个Cell里面的子元素只是用于朗读,那不需要做特别的设置。如果Cell里面有一些需要交互的元素,或者因为一些原因,需要里面每个元素要独立的可设置焦点,那么类似View的处理

  • 让每个Cell里的独立元素都支持无障碍使用 isAccessibilityElement=YES
  • 让Cell本身不支持无障碍使用 isAccessibilityElement=NO
  • 在Cell的label属性中简单描述单元格的所有内容。注意,在这种情label也被看作是单元格中一个支持无障碍访问的元素。

这时候点击Cell的朗读规则要类似系统的股票应用,把每个元素的label拼接在一起作为Cell的label,而不是分开每个元素单独朗读,这样读起来连贯,听起来类似“苹果公司,432.39美元,涨幅1.3%”,如下面的代码:

  • (NSString *)accessibilityLabel

{

}

- (NSString *)accessibilityLabel   {       NSString *weatherCityLabel = [self.weatherCityaccessibilityLabel];       NSString *weatherTempLabel = [self.weatherTempaccessibilityLabel];         /* Combine the city and temperature information so that VoiceOver users can get the weather information with one gesture. */       return [NSStringstringWithFormat:@"%@, %@", weatherCityLabel, weatherTempLabel]; } 

3.关于父级元素中子元素可设置焦点的代理方法:

通常情况下,如果想让子元素设置焦点,父视图不设置焦点,只要把父视图的isAccessibilityElement=NO,子元素为YES就好,代码大概这样:

    [_testScrollView setIsAccessibilityElement:NO];      [_testView1 setIsAccessibilityElement:YES];      [_testView2 setIsAccessibilityElement:YES];      [_testView3 setIsAccessibilityElement:YES];      [_testView4 setIsAccessibilityElement:YES];
    [_testScrollView setIsAccessibilityElement:NO];       [_testView1 setIsAccessibilityElement:YES];       [_testView2 setIsAccessibilityElement:YES];       [_testView3 setIsAccessibilityElement:YES];       [_testView4 setIsAccessibilityElement:YES]; 

BUT有下面这种情况:

//todo解决一个问题,父视图是UIScrollView,里面有4个subView分别为testView1,testView2,testView3,testView4,ScrollView的isAccessibilityElement为NO,子视图为YES,应该就可以单指滑动切换子视图选择焦点,但实际在项目中,有时候视图的层级会比较复杂,不知道为什么scrollView上面的子元素又不能滑动了,但是用了代理方法后就可以切换,待排查,先用代理方法实现

- (BOOL)isAccessibilityElement      {          return NO;              }      - (NSInteger)accessibilityElementCount      {          //把响应焦点的元素放到itemArray数组中          return [[self itemArray] count];      }      - (id)accessibilityElementAtIndex:(NSInteger)index      {          return [[self itemArray] objectAtIndex:index];      }      //这里可以调整单手指滑动元素选中焦点的顺序      - (NSInteger)indexOfAccessibilityElement:(id)element      {          return [[self itemArray] indexOfObject:element];      }
- (BOOL)isAccessibilityElement       {           return NO;               }       - (NSInteger)accessibilityElementCount       {           //把响应焦点的元素放到itemArray数组中           return [[self itemArray] count];       }       - (id)accessibilityElementAtIndex:(NSInteger)index       {           return [[self itemArray] objectAtIndex:index];       }       //这里可以调整单手指滑动元素选中焦点的顺序       - (NSInteger)indexOfAccessibilityElement:(id)element       {           return [[self itemArray] indexOfObject:element];       } 
原文  http://www.xiaoyaoli.com/?p=1790
正文到此结束
Loading...