一個可訪問的app可以讓任何人使用郭赐,包括哪些殘疾或物理認知障礙的人更振,作為一個有用的工具鲫趁,保留其功能和可用性斯嚎。為了可訪問,一個iOS 應用必須提供VoiceOver用戶界面元素信息挨厚,這樣讓視覺障礙的用戶可以與這些元素交互堡僻。UIKit對象默認可訪問,但你仍然可以從視圖控制器角度做一些事情解決可訪問性疫剃,如下:
· 確保每個用戶界面的元素可訪問钉疫,包括控件和靜態(tài)元素如label。
· 確背布郏可訪問元素提供準確和有用的信息牲阁。
通過編程的方式設置VoiceOver焦點位置,響應特殊VoiceOver手勢壤躲,觀察可訪問性通知城菊,可以增強VoiceOver用戶體驗。
移動VoiceOver光標到一個特定的元素
當你的應用present新視圖到屏幕上碉克,考慮設置VoiceOver光標的位置凌唬。當屏幕的布局發(fā)生變化,VoiceOver焦點漏麦,也成為VoiceOver光標客税,重置其位置到屏幕從左到右從上到下的第一個元素。將光標移動到更合適的元素可以加速界面的用戶導航唁奢。例如霎挟,當push一個新視圖控制器到導航控制器的堆棧上,VoiceOver光標會落到導航欄的后退按鈕上麻掸。你可能希望移動光標到導航欄或新push的頁面的一個元素上酥夭。
為了改變光標的位置,使用 UIAccessibilityPostNotification函數推送UIAccessibilityScreenChangedNotification通知。通知告訴VoiceOver屏幕上的內容發(fā)生變化熬北。當推送通知時疙描,光標定位到你指定的元素上,如列表6-1所示讶隐。
列表6-1 推送一個可訪問性通知可以改變讀出的第一個元素
<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>
布局變化起胰,包括旋轉引起的變化,會重置VoiceOver光標的位置巫延。當視圖控制器的布局發(fā)生變化效五,推送UIAccessibilityLayoutChangedNotification通知。類似UIAccessibilityScreenChangedNotification
通知炉峰,可以指定對象成為VoiceOver的第一個元素畏妖。
響應特殊VoiceOver手勢
VoiceOver定義了五個特殊動作觸發(fā)特定的應用動作。
· Escape疼阔。兩個手指Z形手勢戒劫,關閉模態(tài)對話框或返回到導航層級結構。
· Magic Tap婆廊。雙指雙擊執(zhí)行最想執(zhí)行的動作迅细。
· Three-Finger Scroll。三指劃動垂直或水平滾動內容淘邻。
· Increment茵典。一個手指向上劃動增加元素的值。
· Decrement列荔。一個手指向下劃動減少元素的值敬尺。
使用這些手勢執(zhí)行視圖和視圖控制器的特定任務。UIKit查找實現相關手勢的方法贴浙。它使用responder鏈從VoiceOver聚焦的元素開始搜索方法砂吞。如果沒有對象實現合適的方法,UIKit為該手勢執(zhí)行默認系統(tǒng)動作崎溃。例如蜻直,如果在當前視圖或應用代理中沒有找到magic tap的實現,magic tap手勢播放和暫停音樂應用的音樂播放袁串。
雖然可以采取任何行動處理程序概而,VoiceOver用戶期望應用的行為遵循一定的準則。像其他手勢囱修,VoiceOver手勢的實現應該遵循模式赎瑰,這樣與可訪問應用的交互仍然是直觀的。
注意
所有特殊VoiceOver手勢方法返回一個布爾值破镰,該值確定是否通過響應鏈傳播餐曼。停止傳播压储,返回YES。否則源譬,返回NO集惋。
Escape
使用 accessibilityPerformEscape方法處理Escape手勢。對于覆蓋內容的視圖踩娘。例如模態(tài)對話框或彈框刮刑,使用該方法移除覆蓋。Escape手勢的功能就像鍵盤上Esc鍵的功能养渴;它取消臨時對話框或顯示主要內容的表單雷绢。你可以使用Escape手勢返回到自定義導航層級結構。如果使用UINavigationController
對象厚脉,你不需要實現這個手勢习寸,該對象已經處理這個手勢。
Magic Tap
使用 accessibilityPerformMagicTap方法處理Magic Tap手勢傻工。Magic Tap手勢可以非常迅速執(zhí)行常用或最想用的行為。例如孵滞,在手機應用中中捆,Magic Tap可以接起或掛斷電話,在時鐘應用中坊饶,Magic Tap啟動或停止秒表泄伪。可以使用這個手勢來觸發(fā)VoiceOver光標突出顯示的元素的其他動作匿级。在應用中處理Magic Tap手勢蟋滴,需在應用代理中實現accessibilityPerformMagicTap
方法。
Three-Finger Scroll
當一個VoiceOver用戶執(zhí)行一個three-finger scroll手勢痘绎,使用accessibilityScroll: 方法滾動自定義視圖的內容津函。自定義視圖顯示書籍的一頁,可以使用該手勢翻頁孤页。傳遞給該方法的參數表示滾動的方向尔苦。
Increment and Decrement
使用 accessibilityIncrement和accessibilityDecrement方法來增加或減少元素的值。UIAccessibilityTraitAdjustable
特征的元素必須使用該方法行施。
監(jiān)聽可訪問性通知
UIKit發(fā)送可訪問性通知告知應用相關的事件允坚。應用對象可以監(jiān)聽任何相關通知,并使用它們執(zhí)行適當的任務蛾号。例如稠项,當VoiceOver說完最后一行,iBook應用使用通知來翻頁并繼續(xù)閱讀鲜结。這種行為提供了一個無縫不間斷的閱讀體驗展运。
使用默認通知中心來注冊一個可訪問性通知的觀察者活逆。列表6-2中的例子展示了一個視圖記錄閱讀通知是成功還是被用戶打斷。
列表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>
另一個有用的通知是UIAccessibilityVoiceOverStatusChanged通知乐疆』裕可以使用該通知來檢測VoiceOver是否開啟。如果應用暫停時挤土,通知出現琴庵,接收到通知后應用返回到前臺。
關于可以監(jiān)聽的可訪問性通知列表仰美,參見UIAccessibility協(xié)議參考( UIAccessibilityProtocol Reference)迷殿。
官方原文地址: