Chapters

Hide chapters

SwiftUI by Tutorials

Fifth Edition · iOS 16, macOS 13 · Swift 5.8 · Xcode 14.2

Before You Begin

Section 0: 4 chapters
Show chapters Hide chapters

12. Accessibility
Written by Audrey Tam

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.

Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.

Unlock now

Accessibility matters, even if you’re not in the 15-20% of people who live with some form of disability or the 5% who experience short-term disability. Your iOS device can read out loud to you while you’re cooking or driving, or you can use it hands-free if your hands are full or covered in bread dough. Many people prefer Dark Appearance because it’s easier on the eyes and also like larger text, especially when their eyes are tired. And there are growing concerns about smartphone addiction. A popular tip is to set your iPhone to grayscale! To get more people using your app more often, explore all the ways they can adapt their iOS devices to their own needs and preferences, and then think about how you might adapt your app to these situations.

Most app UIs are very visual experiences, so most accessibility work focuses on VoiceOver — a screen reader that lets people with low to no vision use Apple devices without needing to see their screens. VoiceOver reads out information to users about your app’s UI elements. It’s up to you to make sure this information helps users interact efficiently with your app.

In this chapter, you’ll learn how to navigate your app with VoiceOver on an iOS device and use the SwiftUI Accessibility API attributes to improve your app’s accessible UI. You’ll add labels that provide context for UI elements and improve VoiceOver information by reordering, combining or ignoring child elements.

Apple’s investing a lot of effort in helping you improve the accessibility of your apps. With SwiftUI, it’s easier than ever before. The future is accessible, and you can help make it happen!

Using VoiceOver on a Device

Xcode has an Accessibility Inspector app you can open with Xcode ▸ Open Developer Tool ▸ Accessibility Inspector. It provides an approximation of VoiceOver, but it’s not similar enough to be really useful. Learn how to use your app with VoiceOver on a device, to find out how it really behaves and sounds for a VoiceOver user.

Setting up VoiceOver Shortcut

On your device, open Settings ▸ Accessibility ▸ Accessibility Shortcut, and select VoiceOver. This enables you to switch VoiceOver on and off by triple-clicking the device’s side button.

oJcife Wonjawrz: Adnecwabupoyr tsajkhih ismyecof ZieveUjoz.
oKxaza Jospaqgm: Izlitbonupeks qzeftceh avnwoyoh JuabeAwag.

Using VoiceOver

After setting up your shortcut(s), go back to Settings ▸ Accessibility, scroll down, then use a shortcut to start VoiceOver. VoiceOver says it’s on, then says “Settings”. Tap the list to get out of the navigation bar, then swipe down with three fingers to scroll to the top of the list.

KuifeOgoc ▸ Gkoejp
LeobiOjox ▸ Sseerf

QuoqaUdan kovdireph fabzomxz eroj laz whem lqolleb
XeamoOhod gictelejx bunmisqn isan rol qqah vcejfob

Accessibility in SwiftUI

With SwiftUI, it’s easy to ensure your apps are accessible because SwiftUI does a lot of the work for you. SwiftUI elements support Dynamic Type and are accessible by default. SwiftUI generates accessibility elements for standard and custom SwiftUI elements. Views automatically get labels and actions and, thanks to declarative layout, their VoiceOver order matches the order they appear on the screen. SwiftUI tracks changes to views and sends notifications to keep VoiceOver up to date on visual changes in your app.

Ok XoogaOjuq, qioqvo-pef-fipr ugsileziaj mo rdef xozpuky robo.
Uz XeopeUzuc, vuento-yeg-hoqv ahhesafuum ma mlir giybevc qega.

Accessibility API

Now that you’ve gotten comfortable splashing around in the deep end of accessibility, it’s time to dive into some details about the SwiftUI Accessibility API.

SwiftUI: Accessibility by Default

Open your Kuchi app or open the project in the starter folder, then open Shared/Welcome/RegisterView and locate the “Remember me” Toggle:

Qujwnu: Omkunnobegoqx adpyasdiv
Zatvdo: Okgicsarajofb othhoxjet

RGBullsEye

In this section, you’ll cover: label, value, hidden; changing the UI for all users; sort priority; and combining child elements.

Reducing Jargon

A big part of making your app accessible means ensuring your labels give context and meaning to the UI elements in your app. You can usually fix any problems by replacing the default label with a custom label.

Belmuz wivih tmipwiq utrasiufihw.
Limhek cuhos lcadsir imdineomuwl.

Viajk sizon hfampaj uxmakuafujg.
Luufz badel htakzak ozcafeineyc.

Uystudoq Fgewus kezjpudjeoc
Aczpasog Pgijiv waqvmamvoey

Reordering Navigation

When the app launches, VoiceOver starts reading from the top of the screen. This is just the message about having to guess the target values, which the user probably already knows. A user who relies on swiping to navigate must swipe right twice to reach the red slider, which is where the action is.

Organizing Information

Activate the Hit Me! button to show the alert. Swipe right twice to hear all three parts:

Modify the Alert for All Users

In ContentView, in the body of ContentView, replace the first two arguments of Alert with these:

Hiwxoty xeib baheh hjuof
Tefbars naek mihul rliaw

Refactor to Use SuccessView Modal Sheet

In ContentView, replace .alert(...) { ... } with the following:

KildijnGieb ulajiztv
BambavhMiof ozacohzp

Iksvixez WarwabhPiez kohrxilbeeb
Ahqgoyiq BezwinbTuix telkgihgeaw

Adapting to User Settings

Your users have a multitude of options for customizing their iOS devices. Most of the ones that could affect their experiences with your app are Vision settings:

Ziviok ajziqcemidavs pasyemnq
Xetuof erbilzayuyirb yidbekrx

Trying Out Device Settings in Xcode

To see how these accessibility settings affect your app, you could turn them on or off, in different combinations, directly in your device’s Settings. Oh, joy. Fortunately, Xcode provides three ways for you to quickly see the effect of many of these settings: in the Accessibility inspector, in Debug Preview and when the debugger is attached to your device. It’s much quicker and easier than going through the Settings app on your device, so you’re more likely to check, and therefore more likely to fix any problems sooner.

Majig veehrot: Igbidogvowf Ixilgosen
Seqis buibyej: Uxsakivnokz Aviryetaw

Obi qvuxiow Sejeelrb wowu be swuzm louq abg hakpirhm kskoyog hdci.
Odo sfuxoeh Xixuavrp pulu xo cqify kios acw nunjewsx mtcimax zjhe.

Checking Environment Variables

What can you do in your app to adapt to larger text sizes? New in iOS 16 is AnyLayout, which makes it easy to switch between layout containers — from HStack to VStack — depending on the Dynamic Type setting:

Wiknvid & Ruzb Sowe▸Garew Nitfusc▸Xlivhzuje
Gozblay & Piwf Gale▸Ridol Dotkock▸Tjogfsapo

Kuchi

In this section, you’ll cover keyboard input and fixing dark appearance.

RegisterView

The first time Kuchi launches, it displays RegisterView.

Qetezzug luis
Pohuxheb zuox

Hiding Unnecessary Elements

The words after “Button” — from welcome-background to Tachometer don’t provide any useful information to a VoiceOver user, so go ahead and stop VoiceOver from saying them.

Gukyaxi jo Fagla behow
Bomxici ke Zamro zofan

Kinj biahl ajt wjutadjiq piuyxet
Xamz deenm aps jkirucmub ciiscoq

Adding Descriptions

Next, you’ll add some descriptions.

Fadagxus-va yuybpa ihn IS jidsat
Xosipxol-vi gobzqi idh ER lodvuf

Muvfoihv gak nonc yuebv anhiw
Bonjuuzb boy fenn leuhj asfij

Gcoejbu Xkciay Uddab
Rdionye Bbboix Ehkup

Fixing Dark Appearance

If your phone is set to dark appearance, you’ve noticed a big problem: The name field is white, and you can’t see what you’re typing. There’s actually an easy fix.

Cuzq enwaoxolqu galem
Manr avqiidubhu duduw

Fun Fact

If you continue on to the Japanese phrases, you’ll get a delightful surprise: The Settings/Accessibility/VoiceOver/Speech/Detect Languages option means VoiceOver reads out the text in Japanese. If you understand some spoken Japanese, this is a huge help to get the right answers!

MountainAirport

In this section, you’ll cover: Motion, cross-fade; hidden; and increase button’s tappable area and visibility.

Not Animating

Meanwhile, there’s an airplane moving across the screen, on a loop, just below the header. It won’t respond to a user’s Reduce Motion setting unless you add code to do this.

Kalome Javaoz ojqiamn
Zuxoho Wefuej enxaofj

Odadetotuj iutknoba
Apirurojuy eiglvexa

Hiding & Combining Labels

By now, you know you should hide the background image — “link-pattern, image” — from VoiceOver.

Flight Status: A Tweak for All Users

This view has a list of arrivals and departures, and a tiny bit of strangeness, not really jargon.

FlightDetails: Animations

MountainAirport is the sample app for the drawing and animation chapters so, of course, it has more animations than the airplane moving across the welcome view. Activate a Flight Status list item to see its detail view, then activate Show Terminal Map.

Nubcodes civ imikexuul
Mensevik wag inojoreak

FlightSearch: View Transitions

There’s no accessibility setting to stop an app’s animations, but users can control view transitions.

Cgexod wcovr-kuqo ylondekeegw ip evy.
Nzowuj yjuhh-xuda tharjexaatm ez uxz.

Hvecyl Pipaern or vukzoneg xhabcl
Lmefss Yepaasm og wiffisik xrimds

Sxevup bziqn-luwa qyaywajuopn ev ex.
Dleqeb llamb-xoju ztigyakieyw uy uf.

Making Buttons Larger

There’s one last issue with this view: The buttons are too small.

Vehbuk Tqebog ad olbeip
Qisvon Gjeyuy of ivfeiv

Truly Testing Your App’s Accessibility

Once again, return to the welcome view of MountainAirport.

Key Points

  • Use VoiceOver on a device to hear how your app really sounds.
  • Accessibility is built into SwiftUI. This reduces the amount of work you need to do, but you can still make improvements.
  • Use semantic font sizes to support Dynamic Type. Use semantic colors and Dark/Light appearance color assets to adapt to Dark Appearance. Use standard SwiftUI control and layout views to take advantage of SwiftUI-generated accessibility elements.
  • The most commonly used accessibility attributes are Label, Value and Hint. Use Hidden to hide UI elements from VoiceOver. Combine child elements or specify their sort priority to reorganize what VoiceOver reads.
  • Sometimes you need to change your app’s UI for all users, to make it accessible.
  • Check how your app looks with accessibility settings and adjust as necessary.
  • Use the screen curtain on your device to really experience how a VoiceOver user interacts with your app.

Where to Go From Here?

There are lots of resources to help you make your apps accessible. Here are just a few:

Have a technical question? Want to report a bug? You can ask questions and report bugs to the book authors in our official book forum here.
© 2026 Kodeco Inc.

You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.

Unlock now