支持輔助行功能

前言

為什么翻譯這系列文章

概述

一個(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

使用accessibilityIncrementaccessibilityDecrement方法來增加或者減少元素中的值算柳。使用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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蜂筹,一起剝皮案震驚了整個(gè)濱河市需纳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艺挪,老刑警劉巖不翩,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麻裳,居然都是意外死亡口蝠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門津坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妙蔗,“玉大人,你說我怎么就攤上這事疆瑰∶鸨兀” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵乃摹,是天一觀的道長禁漓。 經(jīng)常有香客問我,道長孵睬,這世上最難降的妖魔是什么播歼? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上秘狞,老公的妹妹穿的比我還像新娘叭莫。我一直安慰自己,他們只是感情好烁试,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布雇初。 她就那樣靜靜地躺著,像睡著了一般减响。 火紅的嫁衣襯著肌膚如雪靖诗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天支示,我揣著相機(jī)與錄音刊橘,去河邊找鬼。 笑死颂鸿,一個(gè)胖子當(dāng)著我的面吹牛促绵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘴纺,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼败晴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了栽渴?” 一聲冷哼從身側(cè)響起尖坤,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熔萧,沒想到半個(gè)月后糖驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佛致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年贮缕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺榆。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡感昼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罐脊,到底是詐尸還是另有隱情定嗓,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布萍桌,位于F島的核電站宵溅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏上炎。R本人自食惡果不足惜恃逻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寇损,春花似錦凸郑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浊吏,卻和暖如春而昨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卿捎。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來泰國打工配紫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留径密,地道東北人午阵。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像享扔,于是被迫代替她去往敵國和親底桂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容