一個(gè)可訪問的app可以讓任何人使用,包括哪些殘疾或物理認(rèn)知障礙的人,作為一個(gè)有用的工具,保留其功能和可用性。為了可訪問,一個(gè)iOS 應(yīng)用必須提供VoiceOver用戶界面元素信息,這樣讓視覺障礙的用戶可以與這些元素交互。UIKit對象默認(rèn)可訪問,但你仍然可以從視圖控制器角度做一些事情解決可訪問性,如下:
· 確保每個(gè)用戶界面的元素可訪問,包括控件和靜態(tài)元素如label。
· 確??稍L問元素提供準(zhǔn)確和有用的信息。
通過編程的方式設(shè)置VoiceOver焦點(diǎn)位置,響應(yīng)特殊VoiceOver手勢,觀察可訪問性通知,可以增強(qiáng)VoiceOver用戶體驗(yàn)。
移動(dòng)VoiceOver光標(biāo)到一個(gè)特定的元素
當(dāng)你的應(yīng)用present新視圖到屏幕上,考慮設(shè)置VoiceOver光標(biāo)的位置。當(dāng)屏幕的布局發(fā)生變化,VoiceOver焦點(diǎn),也成為VoiceOver光標(biāo),重置其位置到屏幕從左到右從上到下的第一個(gè)元素。將光標(biāo)移動(dòng)到更合適的元素可以加速界面的用戶導(dǎo)航。例如,當(dāng)push一個(gè)新視圖控制器到導(dǎo)航控制器的堆棧上,VoiceOver光標(biāo)會(huì)落到導(dǎo)航欄的后退按鈕上。你可能希望移動(dòng)光標(biāo)到導(dǎo)航欄或新push的頁面的一個(gè)元素上。
為了改變光標(biāo)的位置,使用 UIAccessibilityPostNotification函數(shù)推送UIAccessibilityScreenChangedNotification通知。通知告訴VoiceOver屏幕上的內(nèi)容發(fā)生變化。當(dāng)推送通知時(shí),光標(biāo)定位到你指定的元素上,如列表6-1所示。
列表6-1 推送一個(gè)可訪問性通知可以改變讀出的第一個(gè)元素
<pre><code>
- @implementation MyViewController
- (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
- // The second parameter is the new focus element.
- UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, self.myFirstElement);
- }
- @end
</pre></code>
布局變化,包括旋轉(zhuǎn)引起的變化,會(huì)重置VoiceOver光標(biāo)的位置。當(dāng)視圖控制器的布局發(fā)生變化,推送UIAccessibilityLayoutChangedNotification通知。類似UIAccessibilityScreenChangedNotification
通知,可以指定對象成為VoiceOver的第一個(gè)元素。
響應(yīng)特殊VoiceOver手勢
VoiceOver定義了五個(gè)特殊動(dòng)作觸發(fā)特定的應(yīng)用動(dòng)作。
· Escape。兩個(gè)手指Z形手勢,關(guān)閉模態(tài)對話框或返回到導(dǎo)航層級(jí)結(jié)構(gòu)。
· Magic Tap。雙指雙擊執(zhí)行最想執(zhí)行的動(dòng)作。
· Three-Finger Scroll。三指劃動(dòng)垂直或水平滾動(dòng)內(nèi)容。
· Increment。一個(gè)手指向上劃動(dòng)增加元素的值。
· Decrement。一個(gè)手指向下劃動(dòng)減少元素的值。
使用這些手勢執(zhí)行視圖和視圖控制器的特定任務(wù)。UIKit查找實(shí)現(xiàn)相關(guān)手勢的方法。它使用responder鏈從VoiceOver聚焦的元素開始搜索方法。如果沒有對象實(shí)現(xiàn)合適的方法,UIKit為該手勢執(zhí)行默認(rèn)系統(tǒng)動(dòng)作。例如,如果在當(dāng)前視圖或應(yīng)用代理中沒有找到magic tap的實(shí)現(xiàn),magic tap手勢播放和暫停音樂應(yīng)用的音樂播放。
雖然可以采取任何行動(dòng)處理程序,VoiceOver用戶期望應(yīng)用的行為遵循一定的準(zhǔn)則。像其他手勢,VoiceOver手勢的實(shí)現(xiàn)應(yīng)該遵循模式,這樣與可訪問應(yīng)用的交互仍然是直觀的。
注意
所有特殊VoiceOver手勢方法返回一個(gè)布爾值,該值確定是否通過響應(yīng)鏈傳播。停止傳播,返回YES。否則,返回NO。
Escape
使用 accessibilityPerformEscape方法處理Escape手勢。對于覆蓋內(nèi)容的視圖。例如模態(tài)對話框或彈框,使用該方法移除覆蓋。Escape手勢的功能就像鍵盤上Esc鍵的功能;它取消臨時(shí)對話框或顯示主要內(nèi)容的表單。你可以使用Escape手勢返回到自定義導(dǎo)航層級(jí)結(jié)構(gòu)。如果使用UINavigationController
對象,你不需要實(shí)現(xiàn)這個(gè)手勢,該對象已經(jīng)處理這個(gè)手勢。
Magic Tap
使用 accessibilityPerformMagicTap方法處理Magic Tap手勢。Magic Tap手勢可以非常迅速執(zhí)行常用或最想用的行為。例如,在手機(jī)應(yīng)用中,Magic Tap可以接起或掛斷電話,在時(shí)鐘應(yīng)用中,Magic Tap啟動(dòng)或停止秒表??梢允褂眠@個(gè)手勢來觸發(fā)VoiceOver光標(biāo)突出顯示的元素的其他動(dòng)作。在應(yīng)用中處理Magic Tap手勢,需在應(yīng)用代理中實(shí)現(xiàn)accessibilityPerformMagicTap
方法。
Three-Finger Scroll
當(dāng)一個(gè)VoiceOver用戶執(zhí)行一個(gè)three-finger scroll手勢,使用accessibilityScroll: 方法滾動(dòng)自定義視圖的內(nèi)容。自定義視圖顯示書籍的一頁,可以使用該手勢翻頁。傳遞給該方法的參數(shù)表示滾動(dòng)的方向。
Increment and Decrement
使用 accessibilityIncrement和accessibilityDecrement方法來增加或減少元素的值。UIAccessibilityTraitAdjustable
特征的元素必須使用該方法。
監(jiān)聽可訪問性通知
UIKit發(fā)送可訪問性通知告知應(yīng)用相關(guān)的事件。應(yīng)用對象可以監(jiān)聽任何相關(guān)通知,并使用它們執(zhí)行適當(dāng)?shù)娜蝿?wù)。例如,當(dāng)VoiceOver說完最后一行,iBook應(yīng)用使用通知來翻頁并繼續(xù)閱讀。這種行為提供了一個(gè)無縫不間斷的閱讀體驗(yàn)。
使用默認(rèn)通知中心來注冊一個(gè)可訪問性通知的觀察者。列表6-2中的例子展示了一個(gè)視圖記錄閱讀通知是成功還是被用戶打斷。
列表6-2 注冊可訪問性通知的觀察者
<pre><code>
- @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
</pre></code>
另一個(gè)有用的通知是UIAccessibilityVoiceOverStatusChanged通知??梢允褂迷撏ㄖ獊頇z測VoiceOver是否開啟。如果應(yīng)用暫停時(shí),通知出現(xiàn),接收到通知后應(yīng)用返回到前臺(tái)。
關(guān)于可以監(jiān)聽的可訪問性通知列表,參見UIAccessibility協(xié)議參考( UIAccessibilityProtocol Reference)。
官方原文地址: