淺談Cocoa編程的Accessibility

所謂的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的兩者模式:

  1. Text boxes and list only:控件包括NSTextField,NSTextView,NSTableView,NSOutlineView,NSBrowser等
  2. 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. 保證無鼠標可以正常使用:
    錯誤案例1:重載NSButton的mouseDown把action調(diào)用寫在里面
    錯誤案例2:某些控件只在區(qū)域hover時顯示
  2. NSControl實例的Accessibility方法是實現(xiàn)在它的Cell里面的:
    錯誤案例:直接子類化NSControl,同時又不給其實例創(chuàng)建一個Cell
  3. 讓有用戶交互窗口可以成為keyWindow(borderless的窗口默認不能成為Key)
    錯誤案例:輸入時彈出自動選擇窗口,但是該窗口不能成為Key
  4. Keyboard Access的前提是該Responder的acceptsFirestResponder返回YES
    錯誤案例:有意無意地重載某個控件,并將這個值職位NO
  5. 了解Voice Over的讀出習(xí)慣,提供給它相應(yīng)的信息
    錯誤案例1:子類化NSView,在drawRect里面畫出字符串,voice over不能讀出;
    錯誤案例2:子類化NSButton,在drawRect里面畫出字符串,未設(shè)置title,voice over讀出信息不準確。
  6. 不要改變macOS固有的用戶習(xí)慣
    錯誤案例:添加shortcut時破壞了系統(tǒng)或者AppKit默認響應(yīng)。
  7. 盡量以Cocoa推薦的方式Coding
    錯誤案例:NSTableView通過addView的方式添加每一行的view,或者make出來的view不是NSTableCellView的子View。
  8. Voice Over下,非用戶驅(qū)動的改變也需要反饋給用戶(可使用NSAccessibilityPostNotificationWithUserInfo()來通知Voice Over引擎)
    錯誤案例:網(wǎng)絡(luò)回調(diào)過來,某種狀態(tài)改變了,僅有UI上面有改變,因此視覺障礙者無法或者狀態(tài)改變。

推薦做的

  1. 盡量把NSWindow的autorecalculatesKeyViewLoop屬性設(shè)置為YES,這可以解決大多數(shù)Full Keyboard Access的問題。
  2. 盡量使用Cocoa標準控件,這也是蘋果官方呼吁的,因為手動創(chuàng)建Accessibility相關(guān)方法代價很高,具體請查看蘋果相關(guān)文檔。
  3. 盡量讓控件以響應(yīng)者鏈的規(guī)則去響應(yīng)按鍵消息,過多侵入式干擾式的全局響應(yīng)會影響用戶體驗。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容