前言
概述
一個(gè)可訪問的app是可以被每一個(gè)使用的,包含哪些殘疾和身體有障礙的人士饭宾,同時(shí)保留其功能和可用性作為有用的工具。為了可以被訪問,iOSApp必須使用戶界面上的元素支持VoiceOver楞抡,以供視覺受損的用戶可以與這些元素交互。UIKit對(duì)象默認(rèn)是可訪問的析藕,但仍然可以從視圖控制器的角度來解決可訪問性的問題召廷,包括:
- 確保界面中的每個(gè)用戶元素均可訪問,包括控件和靜態(tài)元素(如標(biāo)簽)账胧。
- 確保無障礙元素提供準(zhǔn)確有用的信息竞慢。
你可以通過編程的方式設(shè)置VoiceOver對(duì)焦環(huán)的位置,通過響應(yīng)特殊的VoiceOver手勢以及觀察輔助功能通知來增強(qiáng)VoiceOver用戶在您的應(yīng)用中的體驗(yàn)治泥。
將VoiceOver光標(biāo)移動(dòng)到指定的元素
當(dāng)你的App在屏幕上展示一個(gè)新的視圖的時(shí)候筹煮,請(qǐng)考慮設(shè)置VoiceOver光標(biāo)的位置。當(dāng)屏幕的布局發(fā)生變化的時(shí)候居夹,VoiceOver光標(biāo)也會(huì)被重置败潦,默認(rèn)的重置方式是會(huì)聚焦在界面上從左到右,上到下的第一個(gè)元素上准脂。將光標(biāo)放在更合適的元素上可以加速用戶對(duì)界面的導(dǎo)航劫扒。舉例來說,當(dāng)將新的視圖控制器推入到導(dǎo)航控制器的堆棧上時(shí)狸膏,VoiceOver光標(biāo)會(huì)落在導(dǎo)航欄的“后退”按鈕上沟饥。你可能需要將光標(biāo)移動(dòng)到導(dǎo)航欄的標(biāo)題或者新推入的頁面的元素。
要改變光標(biāo)的位置湾戳,可以使用UIAccessibilityPostNotification
函數(shù)發(fā)出一個(gè)UIAccessibilityScreenChangedNotification
通知闷板。這個(gè)通知告訴VoiceOver界面上的內(nèi)容發(fā)生了改變。當(dāng)發(fā)送這個(gè)通知時(shí)院塞,指定你想讓光標(biāo)位于的元素上遮晚,如下代碼所示:
@implementation MyViewController
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
self.myFirstElement);
}
@end
布局改變,包括屏幕旋轉(zhuǎn)都會(huì)重置VoiceOver的位置拦止。當(dāng)你的ViewController的布局發(fā)生改變時(shí)县遣,像發(fā)送UIAccessibilityScreenChangedNotification
一樣發(fā)送 UIAccessibilityLayoutChangedNotification
通知,你可以指定VoiceOver光標(biāo)處于哪一個(gè)元素上汹族。
響應(yīng)特定的VoiceOver手勢
VoiceOver定義了5種手勢來觸發(fā)app指定的操作萧求。
- Escape 雙指Z形手勢,用于消除模式對(duì)話框顶瞒,或返回導(dǎo)航層次結(jié)構(gòu)中的一個(gè)級(jí)別夸政。
- Magic Tap 雙指雙擊,執(zhí)行最有意的動(dòng)作榴徐。
- Three-Finger Scroll 三指滑動(dòng)守问,可以垂直或水平滾動(dòng)內(nèi)容匀归。
- Increment 單指向上滑動(dòng)即可增加元素中的值。
- Decrement 單指向下滑動(dòng)可減少元素中的值耗帕。
使用這些手勢來執(zhí)行特定于您的視圖和視圖控制器的任務(wù)穆端。 UIKit查找實(shí)現(xiàn)與手勢相對(duì)應(yīng)的方法的方法。它使用響應(yīng)者鏈搜索該方法仿便,從擁有VoiceOver焦點(diǎn)的元素開始体啰。如果沒有對(duì)象實(shí)現(xiàn)對(duì)應(yīng)的方法,UIKit將為該手勢執(zhí)行默認(rèn)的系統(tǒng)操作嗽仪。例如荒勇,如果在當(dāng)前視圖或者代理中找不到“Magic Tap”實(shí)現(xiàn),則“Magic Tap”手勢將播放并暫停音樂應(yīng)用中的音樂播放闻坚。
盡管您可以在處理程序中采取任何想要的操作枕屉,但VoiceOver用戶希望您的應(yīng)用程序的操作符合特定的指導(dǎo)原則。與任何手勢一樣鲤氢,VoiceOver手勢的實(shí)施應(yīng)遵循一種模式搀擂,以便與可訪問應(yīng)用的交互保持直覺。
所有特殊的VoiceOver手勢方法都會(huì)返回一個(gè)布爾值卷玉,以確定是否通過響應(yīng)者鏈傳播哨颂。要停止傳播,請(qǐng)返回YES;否則相种,退回NO威恼。
Escape
使用accessibilityPerformEscape
方法來處理Escape手勢。對(duì)于覆蓋內(nèi)容的視圖(例如模式對(duì)話框或彈框)寝并,請(qǐng)使用該方法關(guān)閉疊加層箫措。 Escape手勢的功能就像電腦鍵盤上Esc
鍵的功能一樣;它會(huì)取消臨時(shí)對(duì)話框或工作表以顯示主要內(nèi)容。您也可以使用Escape手勢導(dǎo)航自定義導(dǎo)航層次結(jié)構(gòu)中的一個(gè)級(jí)別衬潦。如果您已經(jīng)使用已經(jīng)處理此手勢的UINavigationController對(duì)象斤蔓,則不需要實(shí)現(xiàn)此手勢。
Magic Tap
使用accessibilityPerformMagicTap
方法處理Magic Tap手勢镀岛。 Magic Tap手勢可以快速執(zhí)行常用或最有意的操作弦牡。例如,在電話應(yīng)用程序中漂羊,Magic Tap啟動(dòng)或掛斷電話驾锰,在Clock應(yīng)用程序中,Magic Tap啟動(dòng)并停止秒表走越。您可以使用此手勢來觸發(fā)與VoiceOver光標(biāo)突出顯示的元素不相關(guān)的操作椭豫。要從應(yīng)用程序中的任何位置處理Magic Tap手勢,請(qǐng)?jiān)赼pp的代理中實(shí)現(xiàn)accessibilityPerformMagicTap
方法。
Three-Finger Scroll
使用accessibilityScroll
方法來滾動(dòng)自定義視圖中的內(nèi)容赏酥,當(dāng)VoiceOver用戶使用Three-Finger Scroll手勢的時(shí)候喳整。顯示書籍頁面的自定義視圖可能會(huì)使用該手勢來實(shí)現(xiàn)翻頁操作。傳遞給該方法的參數(shù)是滾動(dòng)的方向今缚。
Increment and Decrement
使用accessibilityIncrement
和accessibilityDecrement
方法來增加或者減少元素中的值算柳。使用UIAccessibilityTraitAdjustable
屬性的元素必須實(shí)現(xiàn)這個(gè)方法低淡。
監(jiān)聽輔助功能通知
UIKit發(fā)送輔助相關(guān)事件的通知給你的App姓言。你App中的對(duì)象可以監(jiān)聽相關(guān)的通知并使用它們執(zhí)行相關(guān)的任務(wù)。舉例來說:iBookApp使用UIAccessibilityAnnouncementDidFinishNotification
通知為了當(dāng)VoiceOver完成讀出頁面最后一行內(nèi)容時(shí)蔗蹋,翻頁并繼續(xù)閱讀何荚。此行為提供了無縫,不間斷的閱讀體驗(yàn)猪杭。
使用默認(rèn)的通知中心來注冊(cè)一個(gè)輔助監(jiān)聽餐塘。下面的代碼展示了一個(gè)記錄公告的閱讀是成功了還是被用戶打斷了。
@implementation MyViewController
-(void)viewDidLoad {
[super viewDidLoad];
[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didFinishAnnouncement:)
name:UIAccessibilityAnnouncementDidFinishNotification
object: nil];
}
- (void)didFinishAnnouncement:(NSNotification *)dict {
NSString *valueSpoken = [[dict userInfo]
objectForKey:UIAccessibilityAnnouncementKeyStringValue];
NSString *wasSuccessful = [[dict userInfo]
objectForKey:UIAccessibilityAnnouncementKeyWasSuccessful];
}
@end
另一個(gè)有用的通知是UIAccessibilityVoiceOverStatusChanged
你可以使用這個(gè)通知來判斷VoiceOver在什么時(shí)間打開或者關(guān)閉皂吮。如果這個(gè)通知在App掛起的狀態(tài)發(fā)生戒傻,你可以在App進(jìn)入前臺(tái)的時(shí)候接受到這個(gè)通知。
其他你可以使用到的輔助類功能監(jiān)聽可以參考UIAccessibility