最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

SwiftUI學(xué)習(xí)100天(Day74 - 項目 15,第一部分)

2023-03-19 12:37 作者:愛上樹の蝸牛  | 我要投稿

原創(chuàng)鏈接:https://www.hackingwithswift.com/100/swiftui

以下內(nèi)容僅供學(xué)習(xí)參考:

我們今天有一個新技術(shù)項目,這次的重點(diǎn)是你可能甚至沒有考慮過的事情:可訪問性。這是衡量我們的應(yīng)用程序可以被具有不同訪問需求的人使用的程度的指標(biāo)——他們可能需要更大的文本,他們可能需要我們避免使用某些顏色以幫助他們清楚地看到事物,他們可能需要我們的 UI 被讀出,等等。

太多的開發(fā)人員完全忽視了可訪問性的重要性,這導(dǎo)致應(yīng)用程序?qū)芏嗳藖碚f完全不透明。蘋果 iPod 的創(chuàng)造者托尼·法德爾 (Tony Fadell) 曾說過:“你的定義取決于你做了什么,也取決于你沒有做什么?!?/p>

當(dāng)然, 你可以跳過輔助功能,而 90% 的人不會注意到,但你是否希望由它來定義?我敢打賭答案是否定的。

今天你有四個主題需要完成,你將在其中了解輔助功能標(biāo)簽、值、提示等。

輔助功能:簡介

讓你的應(yīng)用程序易于訪問意味著采取措施確保每個人都可以充分使用它,無論他們的個人需求如何。例如,如果他們是盲人,那么你的應(yīng)用程序應(yīng)該與系統(tǒng)的 VoiceOver 系統(tǒng)配合良好,以確保你的 UI 可以流暢地閱讀。

SwiftUI 免費(fèi)為我們提供了大量的功能,因?yàn)樗牟季窒到y(tǒng)自然地VStackHStack形成了視圖流。然而,它并不完美,任何時候你可以添加一些額外的信息來幫助 iOS 輔助功能系統(tǒng),它可能會有所幫助。

通常,測試你的應(yīng)用程序的最佳方式是啟用 VoiceOver 支持并在真實(shí)設(shè)備上運(yùn)行該應(yīng)用程序——如果你的應(yīng)用程序與 VoiceOver 配合得很好,那么你很可能已經(jīng)遠(yuǎn)遠(yuǎn)領(lǐng)先于 iOS 應(yīng)用程序的平均水平。

無論如何,在這個技術(shù)項目中,我們將研究一些無障礙技術(shù),然后研究我們之前制作的一些項目,看看它們?nèi)绾紊墶?/p>

現(xiàn)在,請使用 App 模板創(chuàng)建一個新的 iOS 應(yīng)用程序。你應(yīng)該在真實(shí)設(shè)備上運(yùn)行這個項目,這樣你就可以真正啟用 VoiceOver。

致謝:我非常感謝 Robin Kipp 在準(zhǔn)備本章時提供的幫助——他寫了一些關(guān)于他希望看到的有關(guān)可訪問性的詳細(xì)建議,并為我提供了一些很好的例子,說明這將如何影響他自己的個人使用。


使用有用的標(biāo)簽識別視圖

在這個項目的文件中,我放置了四張從 Unsplash 下載的圖片。Unsplash 文件名由圖片 ID 和攝影師姓名組成,因此如果將它們拖到資產(chǎn)目錄中,你會看到它們的名稱如“ales-krivec-15949”等。這本身不是問題,事實(shí)上我認(rèn)為這可能是記住資產(chǎn)來源的一種有用方式。但是,它確實(shí)給屏幕閱讀器帶來了問題。

要開始使用 VoiceOver,我們將創(chuàng)建一個簡單的視圖,該視圖隨機(jī)循環(huán)顯示資產(chǎn)目錄中的四張圖片。將ContentView結(jié)構(gòu)體修改為

這沒有什么復(fù)雜的,但它已經(jīng)有助于說明兩個嚴(yán)重的問題。

如果你尚未在 iOS 設(shè)備的“設(shè)置”應(yīng)用中啟用 VoiceOver,請立即啟用:“設(shè)置”>“輔助功能”>“VoiceOver”,然后將其打開?;蛘?,你可以隨時激活 Siri 并要求啟用或禁用 VoiceOver。

重要提示:緊接在 VoiceOver 開關(guān)下方的是有關(guān)如何使用它的說明。你習(xí)慣的常規(guī)點(diǎn)擊和滑動不再以相同的方式起作用,因此請閱讀這些說明!

現(xiàn)在在你的設(shè)備上啟動我們的應(yīng)用程序,然后嘗試在圖片上點(diǎn)擊一次以將其激活。如果你仔細(xì)聆聽 VoiceOver,你應(yīng)該會聽到兩個問題:

  1. 讀出“Kevin Horstmann 一四一七零五”不僅對用戶沒有幫助,因?yàn)樗緵]有描述圖片,而且實(shí)際上令人困惑——一長串?dāng)?shù)字弊大于利。

  2. 讀完上面的字符串后,VoiceOver 會說“image”。這是真的,它是一個圖像,但它也充當(dāng)一個按鈕,因?yàn)槲覀兲砑恿艘粋€onTapGesture()修飾符。

這些問題中的第一個是 SwiftUI 試圖為我們提供開箱即用的明智行為的副作用:當(dāng)給定圖像時,它會自動使用圖像的文件名作為要讀出的文本。

我們可以通過附加兩個修飾符來控制 VoiceOver 為給定視圖讀取的內(nèi)容:.accessibilityLabel().accessibilityHint()。它們都接受包含我們想要的任何內(nèi)容的文本,但它們有不同的用途:

  • 標(biāo)簽會立即被閱讀,并且應(yīng)該是切中要害的一小段文字。如果這個視圖從用戶數(shù)據(jù)中刪除一個項目,它可能會說“刪除”。

  • 提示會在短暫的延遲后被讀取,并且應(yīng)該提供有關(guān)視圖用途的更多詳細(xì)信息。例如,它可能會說“從你的收件箱中刪除一封電子郵件”。

標(biāo)簽正是我們解決第一個問題所需要的,因?yàn)檫@意味著我們可以保留圖像名稱不變,同時仍然讓 VoiceOver 讀出對用戶有幫助的內(nèi)容。

首先,將第二個圖像描述數(shù)組添加為 ContentView的屬性

現(xiàn)在將此修改器附加到圖像上:

這允許 VoiceOver 讀取正確的標(biāo)簽,而不管出現(xiàn)什么圖像。當(dāng)然,如果你的圖像不是隨機(jī)變化的,你可以直接在修改器中輸入標(biāo)簽。

第二個問題是圖像被識別為圖像。這是不言而喻的事實(shí),但它也無濟(jì)于事,因?yàn)槲覀円褜Ⅻc(diǎn)擊手勢附加到它,因此它實(shí)際上是一個按鈕。

我們可以使用另一個修飾符.accessibilityAddTraits()解決第二個問題。這讓我們可以向 VoiceOver 提供一些額外的幕后信息來描述視圖是如何工作的,在我們的例子中,我們可以通過添加這個修飾符來告訴它我們的圖像也是一個按鈕:

如果你愿意,你也可以刪除圖像特征,因?yàn)樗]有真正增加太多:

通過這些更改,我們的 UI 工作得更好:VoiceOver 現(xiàn)在可以讀取圖像內(nèi)容的有用描述,并且還讓用戶意識到圖像也是一個按鈕。


隱藏和分組輔助功能數(shù)據(jù)

如果你花幾分鐘與活躍的 VoiceOver 用戶相處,你會很快學(xué)到兩件事:他們非常擅長在用戶界面中導(dǎo)航,而且他們還經(jīng)常將閱讀速度設(shè)置得非常快——比你我使用的快得多.

在設(shè)計我們的 UI 時,將這兩件事都考慮進(jìn)去很重要:這些用戶不僅僅是出于好奇而嘗試 VoiceOver,而是依賴 VoiceOver 來訪問你的應(yīng)用程序的 VoiceOver 高級用戶。因此,確保我們的 UI 盡可能消除混亂非常重要,這樣用戶就可以快速瀏覽它,而不必聽 VoiceOver 閱讀無用的描述。

除了設(shè)置標(biāo)簽和提示之外,我們還可以通過多種方式控制 VoiceOver 讀出的內(nèi)容。我特別想關(guān)注三個方面:

  • 將圖像標(biāo)記為對 VoiceOver 不重要。

  • 從無障礙系統(tǒng)隱藏視圖。

  • 將多個視圖組合為一個。

所有這些都是簡單的更改,但它們會帶來很大的改進(jìn)。

例如,我們可以通過使用Image(decorative:).?無論是簡單的要點(diǎn)還是應(yīng)用程序吉祥物角色的動畫,它實(shí)際上并沒有傳達(dá)任何信息,因此Image(decorative:)告訴 SwiftUI 它應(yīng)該被 VoiceOver 忽略。

像這樣使用它:

這使得 VoiceOver 可以訪問圖像,如果它具有一些重要的特征,例如.isButton- 當(dāng)它突出顯示時它會說“按鈕”,并且如果我們附加一個有效的點(diǎn)擊手勢 - 但它不會讀出圖像的文件名作為自動 VoiceOver 標(biāo)簽。如果你隨后添加將被讀取的標(biāo)簽或提示。

如果你想更進(jìn)一步,你可以使用.accessibilityHidden()修飾符,它使任何視圖對可訪問性系統(tǒng)完全不可見:

使用該修改器,圖像對 VoiceOver 不可見,無論它具有什么特征。顯然,只有當(dāng)所討論的視圖確實(shí)沒有添加任何內(nèi)容時,你才應(yīng)該使用它——如果你將視圖放置在屏幕外,以至于用戶當(dāng)前看不到它,你也應(yīng)該將它標(biāo)記為 VoiceOver 不可訪問。

從 VoiceOver 隱藏內(nèi)容的最后一種方法是通過分組,這讓我們可以控制系統(tǒng)如何讀取相關(guān)的多個視圖。作為示例,請考慮以下布局:

VoiceOver 將其視為兩個不相關(guān)的文本視圖,因此它會根據(jù)用戶的選擇顯示“你的分?jǐn)?shù)是”和“1000”。這兩者都沒有幫助,這就是.accessibilityElement(children:)修飾符的用武之地:我們可以將它應(yīng)用于父視圖,并要求它將子元素組合成一個單一的可訪問性元素。

例如,這將導(dǎo)致兩個文本視圖一起閱讀:

當(dāng)子視圖包含單獨(dú)的信息時,這非常有效,但在我們的例子中,子視圖確實(shí)應(yīng)該作為一個單獨(dú)的實(shí)體來閱讀。因此,這里更好的解決方案是使用.accessibilityElement(children: .ignore)子視圖對 VoiceOver 不可見,然后向父視圖提供自定義標(biāo)簽,如下所示:

值得嘗試這兩種方法,看看它們在實(shí)踐中有何不同。使用.combine在兩段文本之間添加一個停頓,因?yàn)樗鼈儾灰欢ㄔO(shè)計為一起閱讀。使用.ignore自定義標(biāo)簽意味著可以一次性閱讀所有文本,并且更加自然。

提示:?.ignore?children的默認(rèn)參數(shù),因此你可以獲得與.accessibilityElement(children: .ignore)僅使用 .accessibilityElement()相同的結(jié)果


讀取控件的值

默認(rèn)情況下,SwiftUI 為其用戶界面控件提供 VoiceOver 讀數(shù),雖然這些通常很好,但有時它們只是不符合你的需要。在這些情況下,我們可以使用accessibilityValue()修飾符將控件的值與其標(biāo)簽分開,但我們也可以使用指定自定義滑動操作accessibilityAdjustableAction()。

例如,你可以構(gòu)建一個視圖來顯示由各種按鈕控制的某種輸入,例如自定義步進(jìn)器:


通過點(diǎn)擊交互,這可能會按照你想要的方式工作,但它并不是 VoiceOver 的絕佳體驗(yàn),因?yàn)槊看吸c(diǎn)擊其中一個按鈕時,所有用戶都會聽到“增加”或“減少”。

要解決此問題,我們可以通過使用accessibilityElement()accessibilityLabel()將我們VStack組合在一起,然后添加accessibilityValue()accessibilityAdjustableAction()修飾符以使用自定義代碼響應(yīng)滑動,從而為 iOS 提供有關(guān)如何處理調(diào)整的特定說明。

可調(diào)整的動作為我們提供了用戶滑動的方向,我們可以隨心所欲地做出回應(yīng)。有一個附帶條件:是的,我們可以在遞增和遞減滑動之間進(jìn)行選擇,但我們還需要一種特殊的默認(rèn)情況來處理未知的未來值——Apple 保留在未來添加其他類型調(diào)整的權(quán)利。

這是它在代碼中的樣子:

這讓用戶可以選擇整個VStack來讀出“Value: 10”,然后他們可以向上或向下滑動來操縱值并只讀出數(shù)字——這是一種更自然的工作方式。


SwiftUI學(xué)習(xí)100天(Day74 - 項目 15,第一部分)的評論 (共 條)

分享到微博請遵守國家法律
会宁县| 洞口县| 澳门| 台湾省| 错那县| 大竹县| 湛江市| 获嘉县| 烟台市| 阜城县| 葫芦岛市| 白城市| 青浦区| 麦盖提县| 广东省| 龙岩市| 兰州市| 库尔勒市| 融水| 万载县| 兴海县| 新泰市| 精河县| 长汀县| 南康市| 长宁县| 高平市| 府谷县| 澄城县| 双城市| 荔浦县| 高陵县| 卢龙县| 广东省| 南城县| 晴隆县| 青阳县| 大余县| 铁岭县| 金阳县| 毕节市|