ios 辅助功能

来源:互联网 发布:关于程序员的美剧 编辑:程序博客网 时间:2024/04/28 16:02

    通过辅助功能,开发者可以把iOS应用程序提供给身体有障碍的人士使用。系统的General Settings里面包含一些辅助功能,可以把显示的内容放大,并反转界面颜色等。而对于开发者来说,辅助功能主要是围绕着VoiceOver来实现的,它可以令视障用户“听”到程序的GUI。VoiceOver能够以声音来描述程序的图形界面。

    不要把VoiceOver与Voice Control或Siri语音助手相混淆。VoiceOver能够以声音来描述UI,并且与手势结合的非常紧密,而后两者是苹果公司的语音识别专利的技术,能够在不用手操作的前提下控制手机。

 1、辅助功能基础知识

    为UI元件添加描述性的属性,即可创建辅助功能。这套编程接口��名为UIAccessibility的非正式协议来定义,该协议包含一系列属性,其中包括标签、提示以及值等。这些内容合在一起,向VoiceOver提供信息,使它可以把程序界面用语音描述出来。

    UIAccessibility协议包含属性:

    1、accessibilityTraits——用于表述UI元件的一系列标志。这些标志指明了控件的行为,并告诉解释系统应该如何对待此控件。比方说,有一些标志与状态相关,描述了控件是否处于受选或启用状态,还有一些与行为相关,描述了控件的行为是否与按钮类似。

    2、accessibilityLabel——该属性是描述视图角色或控制动作的短语。标签可以本地化。

    3、accessibilityHint——该属性是个短语,用来描述用户可以通过此控件执行何种操作,该属性可以本地化。

    4、accessibilityFrame——该矩形描述了非视图的元件应该如何显示在屏幕上面,对于普通的UIView视图来说,该属性就是其frame属性。

    5、accessibilityPath——对于非矩形的元件来说,可以用UIBezierPath来描述它的形状,而不使用accessibilityFrame来描述。

    6、accessibilityValue——他是与控件相关联的值,比如滑竿的当前值或开关的状态。

2、启用辅助功能

    Enabled复选框用来决定UIKit视图是否与VoiceOver协同运作。如果想宣传某元件支持辅助功能,需要以代码将isAccessibilityElement属性设置为YES。这个布尔值属性用来表示GUI元件是否参与到辅助系统之中。默认情况下,所有UIControl实例的isAccessibilityElement属性都是YES。

    一般来说,可以无障碍访问的子视图所在的容器不开启辅助功能,其他视图都应该开启辅助功能。其他视图都应该开启辅助功能。也就是说,只应该在用户能够直接操作或直接看到的控件上面启用辅助功能。用来容纳其他视图的容器在语音展示系统里面并没有实质作用,所以应将其排除在外。

    表格视图的单元格能够很好的说明什么是可以无障碍访问的控件所在的容器。下面两条规则适用于单元格:

    1、如果单元格里面没有嵌入控件,那么该单元格应该开启辅助功能。

    2、如果单元格里嵌入了控件,那么单元格本身不应该开启辅助功能,但它里面的子控件应该开启辅助功能。

3、特征

    特征描述了UIKit控件的行为。VoiceOver采用特征来描述程序的界面。开发者可以给视图设置许多特征。我们可以在选定的视图上面设置它应有的特征,也可以通过编程的方式来修改特征。

    特征可用来向VoiceOver系统描述界面中的元件。他们指明了控件的行为,以及VoiceOver应该如何对待此控件。开发者通过accessibilityTraits属性来设置特征,我们可以只设置一个标志,也可以用OR把多个标志组合起来,这些特征标志的运作方式不同,VoiceOver使用它们的方式也不同。

    最基本的标志即默认的标志是“没有特征”:

    UIAccessibilityTraitNone——该元件没有与辅助功能有关的特性。

    除此之外,还有一些标志用来描述这个元件是什么,包括:

    1、UIAccessibilityTraitButton——该元件是按钮。    

    2、UIAccessibilityTraitLink——该元件是超链接。

    3、UIAccessibilityTraitStaticText——该元件是一段不变的文本。

    4、UIAccessibilityTraitSearchField——该元件是搜索框

    5、UIAccessibilityTraitImage——该元件是图片。

    6、UIAccessibilityTraitKeyboardKey——该元件是键盘上的按键。

    7、UIAccessibilityTraitHeader——该元件是某段内容的标题。

    苹果公司的辅助功能开发文档里面说,Button、Link、Static Text及Search Field这四个标志是互斥的,开发者只应选择其中之一。如果某个按钮本身也是连接,则要么选择Button,要么选择Link,不能两个都选。我们应该选择最能描述按钮特征的标志。如果按钮可以显示图像,并能在点击的时候发出声音,那么可以随意指定与图像及声音有关的特征,而不必考虑互斥问题。

    下面几个状态标志可以用来描述控件是否受选、是否可以调整以及是否允许用户直接操作它:

    1、UIAccessibilityTraitSelected——表示该控件当前处于受选状态,可用来描述分段选择控件中的分段或者表格中的行。

    2、UIAccessibilityTraitNotEnabled——表示该控件已经禁用,用户无法操作它。

    3、UIAccessibilityTraitAdjustable——表示该控件可以有多个取值,比如滑竿或选取器控件就是这样。开发者可以实现accessibilityIncrement及accessibilityDecrement方法,已规定用户每次能在当前值的基础上调整多少。

    4、UIAccessibilityTraitAllowDirectInteraction——表示用户是否能够通过触摸来直接操作该控件。

    如果控件在用户操作他的时候会发出声音,那么也可以指定下面这个标志:

    UIAccessibilityTraitPlaySound——表示该控件会在激活是发出声音。

    最后,还有一些状态标志用来描述控件的行为,并告诉用户该控件如何与外部环境互动:

    1、UIAccessibilityTraitUpdatesFrequently——表示该控件变化的很频繁,所以用户不需要经常了解它的状态变化,比方说秒表的度数就是如此。

    2、UIAccessibilityTraitStartsMediaSession——表示该控件会启动一段媒体会话。播放或录制音频、视频时,可以使用该标志,以防VoiceOver打断。

    3、UIAccessibilityTraitSummaryElement——表示该控件会在应用程序中提供摘要信息,例如当前的设置或状态等。

    4、UIAccessibilityTraitCausesPageTurn——表示VoiceOver读完控件中的文本之后,该控件会自动翻页。

4、标签

    accessibilityLabel属性用来设置控件的辅助功能标签。好的标签通常会用一个词向用户描述出控件是什么。我们应该像设置按钮文本那样设置GUI的辅助功能标签。Edit、Delete和Add等词都可以描述出控件的用途。这些词既合适用作按钮的文本,也适合用于辅助功能标签的文本。

    accessibilityLabel属性并不局限于按钮。对于文本视图、图像视图以及文本标签来说,也可以分别用Feedback、User Photo及User Name来描述其内容及功能。凡事在视觉界面中有意义的控件,都应该能在VoiceOver里面读出来。下面几条accessibilityLabel的设计技巧:

    1、不要把视图的类型卸载标签里。例如,不要把标签写成"Delete button"(删除按钮)、“Feedback text view”(反馈文本视图)或“User Name text field” (用户名文本框)。由于VoiceOver会自动添加视图类型信息,所以如果在identity面板里面吧标签写成“Delete button”(删除按钮),那么VoiceOver会把它读成“Delete button button”(删除按钮按钮)。

    2、将标签首字母大写,但不要在末尾加句点。VoiceOver会根据大小写情况来决定发音时的语调。如果给标签末尾加了句点,那么VoiceOver一般会以降调来发音,这样读出来的语气与后面的控件类型名称听起来不搭调。“Delete.button”的发音听上去很怪,而“Delete button”的发音则是正确的。        3、把多条描述信息写在一个标签里。如果某些复杂的视图在功能上有一个整体,那么可以把这些视图的描述信息合起来写在一个标签里,并将该标签设置给上级视图。比方说,如果表格的某个单元格里有许多子视图,但这些子视图都不是独立的控件,那么可以考虑在单元格的标签里用一段文本把这些子视图全部描述出来。

    4、只在用户直接操作的视图上面设置标签。如果用户需要直接操作子视图,那就在子视图级别上设置标签,而不要给包含子视图的上级视图设置标签。

    5、本地化。将辅助功能字符串本地化,以尽量扩大程序的目标用户。

5、提示语

    accessibilityHint属性用来设置控件的提示信息。提示信息可以告诉用户操作该控件的效果。当这种效果不太明显的时候,更应该指定提示信息。比方说,界面里有个人名是John Smith,用户点击了名字之后,程序会给这个人拨打电话。由于名字本身并没有描述出用户操作该控件后的效果,所以我们应该添加一条提示语,告诉用户操作该控件之后会发生什么事情。比方说,可以把accessibilityHint设置成“Places a phone call to this person”,或值设置成更为贴切的“Places a phone call to John Smith”。下面给出一些设置accessibilityHint的技巧:

    1、采用句子的形式给出提示语。提示语应该以大写字母开头,并以句点结尾。即便把隐含的主语省略掉,也依然要采用句子的形式。比方说,在省略主语“This button”(该按钮)的情况下,应该把提示语写成“Clears text in the form”(清除表单中的文本)采用这种形式可以保证VoiceOver能够以正确的音调来发声。

    2、动词用来描述控件所做的事情,而不是用户所做的事情。我们应该告诉用户“[This text label] Places a phone call to this person”。([该文本标签用来]给这个人打电话),而不是“[You will]Place a phone call to this person”。([你会]给这个人打电话)。

    3、不要写上GUI元件的名称或类型。不要在提示语里提到待操作的UI控件。GUI的名字及类型都不应该出现。VoiceOver会根据需要自动添加这些信息,我们不要叫它读出多余的词。假如把这两个信息都写入提示语,那么说出来的话就会变成“Delete button[这个button是标签里的]button[这个button是VoiceOver自动补充的]button[这个button是提示语里的]removes item from screen”。使用简洁的“Removes item from screen”就好。    

    4、不要提到操作方式。不要在提示语里给出用户操作该控件的方式。不要把提示语写成“Swiping places a phone call to this person”(通过滑动来给这个人打电话)或“Tapping places a phone call to this person”(点击控件来给这个人打电话)。由于VoiceOver使用自己的一套手势来激活GUI元件,所以不要在提示语里直接描述手势。

    5、把效果描述的详细一些。描述控件的效果时,“Places call”(打电话)这个说法不如“Places a call to this person”好(给这个人打电话),而它又不如“Places a call to John Smith“(给John Smith打电话)好。提示语要能够简短而详尽的告诉用户该操作的效果,但又不能太过简单,以致用户必须猜测才能知道结果。不要使用那种用户必须听第二遍才能明白的提示语。    

    6、本地化。与标签一样,提示语也应该本地化,以便尽量扩大目标用户。

6、把变化情况传播出去

    屏幕上的元素如果不是因为用户的直接操作而发生变化,应用程序就应该向VoiceOver辅助功能系统投递通知,令其知晓这一情况:

    1、添加或移除GUI时,UIAccessibilityLayoutChangeNotification通知可以令VoiceOver辅助功能系统立刻获知相关变化。

    2、完成滚动操作之后,程序应该投递UIAccessibilityPageScrolledNotification通知。通知对象应该包含一条描述新位置的信息。

    3、如果放大后的控件有了变化,那么应该发送UIAccessibilityZoomFocusChanged通知。发送通知时还应该指定type、frame及view这三个参数。第一个参数表示放大类型,第二个参数表示当前放大 的frame(以屏幕坐标来衡量),第三个参数表示包含放大的frame的视图。

    除了上面这些通知之外,还可以通过VoiceOver辅助系统来广播通用的布告。UIAccessibilityAnnouncementNotification接收一个参数,表示包含布告内容的字符串。如果GUI发生了微小的变化,屏幕上发生了短暂的变化,或是发生了不会直接影响UI的变化,那么可以用它来通知用户。



    

0 0
原创粉丝点击