From a42e8583a9d9e42718db61e1a8377a4acf85d2dd Mon Sep 17 00:00:00 2001 From: Scott Berrevoets Date: Mon, 28 Oct 2024 00:43:48 +0900 Subject: [PATCH] Add accessibility blog post --- .../2017-01-18-keeping-lyft-app-accessible.md | 82 ++++++++++++++++++ content/images/AccessibilityFormat.png | Bin 0 -> 10252 bytes content/images/AccessibilitySource.png | Bin 0 -> 20990 bytes pelicanconf.py | 1 + theme/static/css/style.css | 27 +++++- 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 content/2017-01-18-keeping-lyft-app-accessible.md create mode 100644 content/images/AccessibilityFormat.png create mode 100644 content/images/AccessibilitySource.png diff --git a/content/2017-01-18-keeping-lyft-app-accessible.md b/content/2017-01-18-keeping-lyft-app-accessible.md new file mode 100644 index 0000000..f2e310e --- /dev/null +++ b/content/2017-01-18-keeping-lyft-app-accessible.md @@ -0,0 +1,82 @@ +Title: Keeping the Lyft iOS App Accessible +Date: 2017-01-18 +Summary: Explanation on some strategies in how Lyft keeps its iOS app accessible + +!!! note + This article was written by me but originally published on the [Lyft + Engineering Blog](https://eng.lyft.com/keeping-lyft-accessible-53155f0098b9). + +At Lyft we’re in a unique position: every day we work on an app that affects +people in the real, physical world — not just the digital one. This has an +especially large impact on visually impaired users, because our app is +easier to use than the real world alternatives — navigating a train station +or queueing up at a taxi stand. Lyft aims to make a product that is +accessible and easy to use for all of our users. + +## Accessibility at Lyft + +If an app uses Apple’s standard controls and UI elements, it will likely already +work well with VoiceOver; however, Lyft’s UI deviates enough from standard +controls such that we don’t get that benefit out of the box. Another +complication is that many portions of the app are controlled by the server, +including a lot of the text for buttons and labels. Making these UI elements +compatible with VoiceOver often requires tweaking them manually, even if we use +native controls. + +Since we try to keep all of our UI-related code in Interface Builder, and +VoiceOver is just another form of UI, we have written a simple `UIView` +extension that allows us to enable accessibility on most of our UI directly from +Interface Builder. In this extension, we add 2 properties to `UIView`: + +* `accessibilitySources`: An `IBOutletCollection` of `UIView`s +* `accessibilityFormat`: a simple string that represents the format of the + accessibility label, which is subsequently passed to `String(format:)`. Every + occurrence of `%@` in this string will be replaced with the next element of + the `accessibilitySources`, and `[self]` will automatically be replaced with + the current view’s accessibilityLabel. + +We can ctrl + drag UI elements into the `accessibilitySources`, and by marking +`accessibilityFormat` with `@IBInspectable` we can specify the string and the +sources all from Interface Builder, keeping the code clean and to the point. + +For example, we have an accessibility format on the UILabel that displays the +selected ride mode: + +![Setting the accessibility format](/images/AccessibilityFormat.png) + +`[self]` is replaced by the accessibility label, which for `UILabel`s is the +text of the label itself. `%@` is replaced by an accessibility source, which we +can set up like this: + +![Setting the accessibility sources](/images/AccessibilitySource.png) + +By disabling the accessibility label for the subtitle, the top label’s +accessibility label will read “Selected ride mode: Line. Carpool, 2 people +maximum.” without touching any code at all. + +## Changing the process + +As we ramped up our VoiceOver efforts, we wanted to assess whether the changes +we made had a meaningful impact to end-users. As developers, we’re too familiar +with our own apps to make an honest call about their usability, and when it +comes to visual impairment, even a standard usability review could brush over +things that would be challenging to a blind or a visually impaired user. + +This is why we’re working with a dedicated accessibility expert, himself a +native VoiceOver user, to constantly validate our work. All the feedback we’ve +been getting from VoiceOver users have further motivated our investment in +accessibility. We have optimized VoiceOver in the main flows of our app, and we +run weekly regression tests to ensure consistency and stability. Our VoiceOver +user also works directly with QA engineers, to let them know what he is looking +for and what is missing. + +Over the last few months, we have made many improvements in various parts of our +app, but also in how seriously we take VoiceOver-related bugs: we block new +releases if VoiceOver users experience bugs when going through a ride. All new +features are expected to be optimized for VoiceOver from the start, and we are +working hard to optimize existing features as well. + +We think of accessibility as part of the user interface, just like labels, +buttons, and text fields. By having our developers implement support for +VoiceOver as part of the initial feature, our visually impaired users will be +able to use these features as easily as our regular users. diff --git a/content/images/AccessibilityFormat.png b/content/images/AccessibilityFormat.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd9ce08c72067489fa06250bc4088d72c813d39 GIT binary patch literal 10252 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�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 literal 0 HcmV?d00001 diff --git a/pelicanconf.py b/pelicanconf.py index 1bb73ce..db49813 100644 --- a/pelicanconf.py +++ b/pelicanconf.py @@ -14,6 +14,7 @@ 'markdown.extensions.extra': {}, 'markdown.extensions.meta': {}, 'markdown.extensions.toc': {}, + 'markdown.extensions.admonition': {}, }, 'output_format': 'html5', } diff --git a/theme/static/css/style.css b/theme/static/css/style.css index aaf6501..539d7ed 100644 --- a/theme/static/css/style.css +++ b/theme/static/css/style.css @@ -171,7 +171,6 @@ dl#archive dd { margin: 20px 0 20px 40px; } - @media only screen and (max-width: 320px) { dl#archive dd { margin-left: 0; @@ -215,6 +214,32 @@ blockquote { color: #777; } +.admonition { + border-left: 5px solid #4CAF50; /* Accent color for the border */ + background-color: #f9f9f9; /* Light background */ + padding: 15px; + margin: 20px 0; + margin-bottom: 50px; + border-radius: 8px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); +} + +.admonition-title { + font-weight: bold; + font-size: 1.1em; + margin-bottom: 10px; + color: #333; +} + +.admonition p { + margin: 0; +} + +img { + max-width: 100%; + height: auto; +} + div#disqus_thread { margin-top: 50px; padding: 10px;