所謂的Accessibility,即是App的易用性,其涵義不僅包括讓一般用戶方便使用,也更多是指讓視覺障礙聽覺障礙者也能正常地使用。對大多數(shù)開發(fā)者來說這是比較Corner的部分,對大多數(shù)公司來說,花很大精力去做一個回報率微乎其微的東西也得不償失,不過讓你的App更好用,讓更多人使用,造福有障礙人群,也是一件很棒的事情,而且有時候這是必須的(比如賣給美國高校的商用軟件)。下面是一些經(jīng)驗之談,讓你簡單輕便地去實現(xiàn)基本的Accessibility,同時規(guī)避一些對Accessibility不友好的錯誤習(xí)慣
需要知道的
Full Keyboard Access
NSResponder是個抽象類,是Keyboard Access的基礎(chǔ),它定義了一系列響應(yīng)鍵盤事件的方法以供其子類根據(jù)所需來自行實現(xiàn)(如NSButton的Space,NSTableView/OutlineView的方向鍵)。代碼層面NSView中-canBecomeKey:返回YES即為Accessible,通常應(yīng)該返回default。
系統(tǒng)定義了Keyboard Access的兩者模式:
- Text boxes and list only:控件包括NSTextField,NSTextView,NSTableView,NSOutlineView,NSBrowser等
- All controll:原則上是所有控件,包括沒有繼承自NSControl或其子類但交互體驗上屬于控件的NSView的子類
Shortcuts
App層:App收到鍵盤消息,先詢問MainMenu是否有注冊的Item,如果有,就發(fā)送給它的Target或者first responder,如果沒有注冊的Item,就詢問響應(yīng)者鏈,如果有responder相應(yīng)此消息,就發(fā)送給它。
系統(tǒng)層:優(yōu)先于App層。
按鍵消息無人響應(yīng),系統(tǒng)會發(fā)出“Duang”的聲音,提示此次按鍵操作無效。
Voice Over
你可以用Command+F5組合件來切換Voice Over開關(guān)。Cocoa標準控件基本上是Voice Over友好的。常見控件的讀出習(xí)慣如下:
NSTextField的StringValue和placeholder,NSButton的title,NSImageView的image Name,NSTableCellView內(nèi)容。。
Voice Over有一整套的API供你選擇,但是很繁雜,下面這個是Accessibility萬金油:
NSObject (NSAccessibilityAdditions)
-accessibilitySetOverrideValue:<#Description#> forAttribute:NSAccessibilityDescriptionAttribute
需要注意的
- 保證無鼠標可以正常使用:
錯誤案例1:重載NSButton的mouseDown把action調(diào)用寫在里面
錯誤案例2:某些控件只在區(qū)域hover時顯示 - NSControl實例的Accessibility方法是實現(xiàn)在它的Cell里面的:
錯誤案例:直接子類化NSControl,同時又不給其實例創(chuàng)建一個Cell - 讓有用戶交互窗口可以成為keyWindow(borderless的窗口默認不能成為Key)
錯誤案例:輸入時彈出自動選擇窗口,但是該窗口不能成為Key - Keyboard Access的前提是該Responder的acceptsFirestResponder返回YES
錯誤案例:有意無意地重載某個控件,并將這個值職位NO - 了解Voice Over的讀出習(xí)慣,提供給它相應(yīng)的信息
錯誤案例1:子類化NSView,在drawRect里面畫出字符串,voice over不能讀出;
錯誤案例2:子類化NSButton,在drawRect里面畫出字符串,未設(shè)置title,voice over讀出信息不準確。 - 不要改變macOS固有的用戶習(xí)慣
錯誤案例:添加shortcut時破壞了系統(tǒng)或者AppKit默認響應(yīng)。 - 盡量以Cocoa推薦的方式Coding
錯誤案例:NSTableView通過addView的方式添加每一行的view,或者make出來的view不是NSTableCellView的子View。 - Voice Over下,非用戶驅(qū)動的改變也需要反饋給用戶(可使用NSAccessibilityPostNotificationWithUserInfo()來通知Voice Over引擎)
錯誤案例:網(wǎng)絡(luò)回調(diào)過來,某種狀態(tài)改變了,僅有UI上面有改變,因此視覺障礙者無法或者狀態(tài)改變。
推薦做的
- 盡量把NSWindow的autorecalculatesKeyViewLoop屬性設(shè)置為YES,這可以解決大多數(shù)Full Keyboard Access的問題。
- 盡量使用Cocoa標準控件,這也是蘋果官方呼吁的,因為手動創(chuàng)建Accessibility相關(guān)方法代價很高,具體請查看蘋果相關(guān)文檔。
- 盡量讓控件以響應(yīng)者鏈的規(guī)則去響應(yīng)按鍵消息,過多侵入式干擾式的全局響應(yīng)會影響用戶體驗。