iOS Accessibility--VoiceOver

我們可以簡單把Accessibility理解成無障礙化使用疚漆,這個“無障礙”面向群體是視障人士
在iOS中,Accessibility主要分為三部分

  • VoiceOver刁赦,旁白讀屏
  • Zoom娶聘,縮放
  • White on Black,反轉(zhuǎn)顏色
    這里主要介紹VoiceOver

什么是VoiceOver

VoiceOver是蘋果手機(jī)上一個給視力不好或者盲人使用應(yīng)用程序的語音輔助軟件 甚脉,即使你看不見也不成問題丸升。輕觸屏幕即可聽到你手指劃過的內(nèi)容,然后運(yùn)用手勢來控制設(shè)備牺氨。VoiceOver 支持 iPhone狡耻、iPad 或 iPod touch 所配備的 app。

如何打開VoiceOver

  • 手機(jī)設(shè)備
    設(shè)置(Setting)→輔助功能(Accessibility)→旁白(VoiceOver)


    • 輕點一下選擇控件
    • 輕點兩下激活所選控件
    • 三指輕掃滾動視圖
  • 模擬器
    打開Accessibility Inspector進(jìn)行調(diào)試
    Xcode→Open Developer Tool→Accessibility Inspector

如何支持VoiceOver

VoiceOver并不是萬能的猴凹,并不能兼容開發(fā)者自定義的控件和視圖夷狰,因此作為開發(fā)者,需要通過一些額外的工作讓 APP 可以支持無障礙使用郊霎。
所有的標(biāo)準(zhǔn) UIKit 控件和視圖默認(rèn)支持 VoiceOver沼头,當(dāng)然你也可以通過UIAccessibility 編程接口關(guān)閉或者修改。
如果App使用了用戶自定義的一些控件,這時候就需要用戶通過 UIAccessibility編程接口來支持無障礙

  • 什么是AccessibilityElement
    VoiceOver是通過訪問元素達(dá)到無障礙使用的进倍,能被VoiceOver訪問的元素叫做AccessibilityElement土至,UIKit中的基本控件都支持VoiceOver
    UILabel,UIButton這些控件的isAccessibilityElement屬性默認(rèn)就是true猾昆,UIView這個屬性默認(rèn)是false
  • AccessibilityElement的應(yīng)用
    一般的AccessibilityElement系統(tǒng)會自動讀出它的內(nèi)容陶因,所以很多情況下不需要做特殊處理應(yīng)用也會支持VoiceOver,但如果需要讀出其他自定義內(nèi)容就需要了解一下幾個屬性
    • accessibilityLabel:用于描述內(nèi)容“是什么”
    • accessibilityHint:用于描述行動“做什么”
    • accessibilityValue:用于描述“值是多少”
    • accessibilityTraits:一個或多個獨立特征的組合

讀的順序accessibilityLabelaccessibilityValueaccessibilityTraitsaccessibilityHint

let count = 2
addButton.accessibilityLabel = "Add count"
addButton.accessibilityHint = "tap to add count"
addButton.accessibilityValue = "\(count)"
addButton.accessibilityTraits = [.button]
// 如果是單一的控件垂蜗,可以不用設(shè)置accessibilityTraits楷扬,系統(tǒng)會自動識別

這段代碼讀的順序:Add count(accessibilityLabel) 2(accessibilityValue) button(accessibilityTraits) tap to add count(accessibilityHint)

  • 自定義視圖如何支持VoiceOver
    在前面我們有提到View的isAccessibilityElement屬性默認(rèn)為false,所以第一步我們需要開啟isAccessibilityElement么抗,使得VoiceOver可以訪問這個View

  • UIAccessibilityCustomAction
    一個 UIAccessibilityCustomAction 對象代表一個在無障礙對象上執(zhí)行的自定
    義操作

  let save = UIAccessibilityCustomAction(name: "save the custom view",
                                                 target: self,
                                                 selector: #selector(tappedSave))
  accessibilityCustomActions = [save]
  • UIAccessibilityPostNotification
    Accessibility提供了一些列的通知來完成特殊的需求
public static func post(notification: UIAccessibility.Notification, argument: Any?)

例如在App中存在錯誤有彈窗彈出覆蓋屏幕的主要部分毅否,在彈窗彈出后,通過調(diào)用這個方法蝇刀,將焦點聚焦到彈窗標(biāo)題上

UIAccessibility.post(notification: .screenChanged, argument: nil)

實際應(yīng)用

假設(shè)現(xiàn)在有一個UITableview與一個自定義Cell螟加,Cell中有一個按鈕,現(xiàn)在需求是可以訪問Cell與Cell中的按鈕吞琐,且分別讀出不同的內(nèi)容捆探,那么我們要怎么實現(xiàn)這個需求呢
我們首先回想一下前面提到的,當(dāng)一個View(或子類)激活isAccessibilityElement時站粟,它的子視圖都變?yōu)椴豢稍L問了黍图,所以單純設(shè)置Cell為訪問元素然后再訪問子元素這個思路是行不通的

  • 方案一
    我們可以這么做,Cell不激活為isAccessibilityElement奴烙,但是蘋果內(nèi)部是可以將Cell作為整一個訪問元素且設(shè)置它的accessibilityLabel助被,完成button基本設(shè)置后,再設(shè)置button的accessibilityHint就可以實現(xiàn)我們想要的效果
private func setupAccessibility() {
        accessibilityLabel = "cell"
        nameLabel.accessibilityLabel = nameLabel.text
        nameLabel.isAccessibilityElement = true
        logoView.isAccessibilityElement = true
        logoView.accessibilityLabel = "logo"
        button.accessibilityHint = "save the info"
    }
  • 方案二
    我們可以激活Cell為isAccessibilityElement切诀,然后對其添加accessibilityCustomActions綁定對應(yīng)的方法揩环,這個方案,nameLabel幅虑、logoView丰滑、button 雖然已經(jīng)激活為isAccessibilityElement,但依然是無法訪問的倒庵,所以你是看不到訪問的框去到button或者其他控件那里的
private func setupAccessibility() {
        isAccessibilityElement = true
        accessibilityLabel = "cell"
        nameLabel.accessibilityLabel = nameLabel.text
        nameLabel.isAccessibilityElement = true
        logoView.isAccessibilityElement = true
        logoView.accessibilityLabel = "logo"
        button.isAccessibilityElement = true
        button.accessibilityHint = "save the info"

        let action = UIAccessibilityCustomAction(name: "action", target: self, selector: #selector(didTapButton))
        accessibilityCustomActions = [action]
    }

Tips

  • 經(jīng)試驗褒墨,accessibilityHint只有在真機(jī)的情況下才會讀出來,而且與上一個屬性之間間隔大概有1秒的時間擎宝,debug的時候要留意
  • 當(dāng)這整個View作為VoiceOver的訪問元素郁妈,View中的subview都會變?yōu)椴豢稍L問,如果需要都支持VoiceOver绍申,需要改變他們的層級關(guān)系圃庭,且都開啟isAccessibilityElement
  • UIAccessibilityCustomAction觸發(fā)條件在Voice Over的情況下,選中到該元素后,通過上劃或者下劃來選擇需要觸發(fā)的事件


參考文檔
Accessibility Programming Guide for iOS
iOS Accessibility Tutorial: Getting Started
Making Apps More Accessible With Custom Actions


如果大家有其他解決方案歡迎留言交流
支持原創(chuàng)剧腻,版權(quán)所有
未經(jīng)授權(quán)請勿轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者涂屁。
  • 序言:七十年代末书在,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拆又,更是在濱河造成了極大的恐慌儒旬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帖族,死亡現(xiàn)場離奇詭異栈源,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)竖般,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門甚垦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人涣雕,你說我怎么就攤上這事艰亮。” “怎么了挣郭?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵迄埃,是天一觀的道長。 經(jīng)常有香客問我兑障,道長侄非,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任流译,我火速辦了婚禮逞怨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘先蒋。我一直安慰自己骇钦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布竞漾。 她就那樣靜靜地躺著眯搭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪业岁。 梳的紋絲不亂的頭發(fā)上鳞仙,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音笔时,去河邊找鬼棍好。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的借笙。 我是一名探鬼主播扒怖,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼业稼!你這毒婦竟也來了盗痒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤低散,失蹤者是張志新(化名)和其女友劉穎俯邓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熔号,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡稽鞭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了引镊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朦蕴。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祠乃,靈堂內(nèi)的尸體忽然破棺而出梦重,到底是詐尸還是另有隱情,我是刑警寧澤亮瓷,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布琴拧,位于F島的核電站,受9級特大地震影響嘱支,放射性物質(zhì)發(fā)生泄漏蚓胸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一除师、第九天 我趴在偏房一處隱蔽的房頂上張望沛膳。 院中可真熱鬧,春花似錦汛聚、人聲如沸锹安。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叹哭。三九已至,卻和暖如春痕貌,著一層夾襖步出監(jiān)牢的瞬間风罩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工舵稠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留超升,地道東北人入宦。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像室琢,于是被迫代替她去往敵國和親乾闰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353