Upgrade to Pro — share decks privately, control downloads, hide ads and more …

script-iosdevuk-my-award-winning-scheme-for-acc...

Avatar for akidon0000 akidon0000
September 09, 2026
34

 script-iosdevuk-my-award-winning-scheme-for-accessibility

Avatar for akidon0000

akidon0000

September 09, 2026

Transcript

  1. iOSDevUK26 My award winning scheme for accessibility Dan Akiyama Sansan,

    inc. Today, Iʼd like to talk about my award-winning scheme for accessibility. fi But rst, let me introduce myself.
  2. HI, IʼM DAN So, Iʼm Dan Akiyama, but please call

    me Dan. Iʼm an iOS engineer from Japan. Itʼs almost ten thousand kilometres from Japan to here. I travelled all this way to be here with you today. Actually, this is only my second time travelling outside Japan. The rst was iOSConf SG in Singapore. To prepare for today, I started practising my English using a language-exchange app. But my English is still a work in progress. Please bear with me, and fi if we talk again, please use simple English.
  3. > Tittle: Why are iOS buttons blue by default? In

    Japan, I often speak at conferences. For example, I once gave a talk titled “Why are iOS buttons blue by default?” That talk sparked my interest in accessibility. Photo by fromkk
  4. In May this year, I saw this post on my

    X feed. It was posted by Robin. When I saw it, I decided to go all in. I even booked a few days of annual leave to take part. And as a result…
  5. HOW I WON As the title suggests, Iʼll walk you

    through how I won the competition.
  6. iOSDevUK Accessibility Challenge First, let me explain the Accessibility Challenge.

    This is the demo app for this conference. We had two weeks to improve its accessibility and submit a pull request. The best pull request would win. Before I started, I asked myself one question.
  7. WHAT IS ACCESSIBILITY? What is accessibility? Accessibility is often described

    as “better UX.” For developers, accessibility can mean supporting VoiceOver or making text larger. Both are examples of accessibility. But accessibility is more than that, right?
  8. ・VISION ・HEARING ・MOBILITY ・SPEECH ・COGNITIVE Apple gives an answer in

    the Human Interface Guidelines. It is a great guide for making apps more accessible. In fact, the judging criteria were based on its categories. But I wanted my own de nition fi one that made sense to me. So I created this:
  9. Information gets through. To everyone. In every situation. “Information gets

    through.To everyone. In every situation.” An accessibility bug means that some information does not reach the user. fi This de nition made accessibility much easier for me to understand.
  10. SO HOW DID I WIN? So how did I win?

    Actually, I barely touched the codebase myself. AI can handle much of the implementation now. So, whatʼs left for humans?
  11. Anticipate the experience. “Anticipate the experience.” This phrase is also

    one of my companyʼs core values. Can you imagine how a user feels when information does not reach them? That was the key to this challenge: having a clear de nition and imagining the userʼs experience. With these two ideas, you already know 90% of how I won the award. / Maybe you can win next year! But we still have time, so letʼs look at that 90% more closely. fi For example, what if you could not tell colours apart?
  12. Is this ON or OFF? Quiz time! Is this toggle

    on or o ? Who already knows the answer? (Raise your hand?) ff Great, thank you!
  13. Is this ON or OFF? Yes̶itʼs on. But we did

    not use colour to answer. We used its position. Appleʼs toggle uses more than just colour. You have used this accessible design for years without noticing it.
  14. Is this ON or OFF? There is also a setting

    called “On/O Labels.” When you turn it on, symbols appear on the toggle. ff Now we have two ways to understand it: position and symbols, not just colour.
  15. Is this ON or OFF? Okay, question two. How about

    this one? (Who knows the answer?) Fewer hands this time. Thank you. When colour is the only clue, we can get lost.
  16. So, what can we do? Make the colour darker? Add

    a border? Still, thereʼs no guarantee.
  17. What about On/O Labels? They help us avoid the colour

    problem. But I wasnʼt sure they t the design. So I wanted to use shape to show whether it was on or o , while keeping the design clean. ff fi ff Hereʼs my answer.
  18. Anticipate the experience. This is what I mean by “Anticipate

    the experience.” Today, Iʼll cover four topics. Letʼs go through them one by one.
  19. Too small. Generated with Gemini This is my grandma. She

    doesnʼt see very well, so itʼs hard for her to read small text on her phone.
  20. Generated with Gemini Hereʼs the list of venues in demoapp.

    Each venue has a name and description. But to my grandma, it looks like …
  21. Now the text is bigger and clearer. My grandma is

    happy. But wait̶look closely.
  22. Now part of the description is missing. The text is

    bigger, but some information does not get through.
  23. Information gets through. To everyone. In every situation. Remember this?

    Information gets through. To everyone. In every situation. fi So, letʼs x it.
  24. import SwiftUI extension View { func a11yLineLimit(_ standard: Int, extra:

    Int = 2) -> some View { modifier(A11yLineLimitModifier(standard: standard, extra: extra)) } } private struct A11yLineLimitModifier: ViewModifier { @Environment(\.dynamicTypeSize) private var dynamicTypeSize let standard: Int let extra: Int } fi I created a modi er that changes the line limit. func body(content: Content) -> some View { content.lineLimit( dynamicTypeSize.isAccessibilitySize ? standard + extra : standard ) }
  25. import SwiftUI extension View { func a11yLineLimit(_ standard: Int, extra:

    Int = 2) -> some View { modifier(A11yLineLimitModifier(standard: standard, extra: extra)) } } private struct A11yLineLimitModifier: ViewModifier { @Environment(\.dynamicTypeSize) private var dynamicTypeSize let standard: Int let extra: Int } func body(content: Content) -> some View { content.lineLimit( dynamicTypeSize.isAccessibilitySize ? standard + extra : standard ) } The environment gives us dynamicTypeSize. Its isAccessibilitySize property tells us if the user is using an accessibility text size. Based on that, I change the line limit from two to four.
  26. import SwiftUI extension View { func a11yLineLimit(_ standard: Int, extra:

    Int = 2) -> some View { modifier(A11yLineLimitModifier(standard: standard, extra: extra)) } } private struct A11yLineLimitModifier: ViewModifier { @Environment(\.dynamicTypeSize) private var dynamicTypeSize let standard: Int let extra: Int } Now my grandma is happy too! func body(content: Content) -> some View { content.lineLimit( dynamicTypeSize.isAccessibilitySize ? standard + extra : standard ) }
  27. Letʼs look at another screen. This is the session details

    screen. Letʼs make the text bigger̶for my grandma.
  28. import SwiftUI struct SessionDetailView: View { var body: some View

    { HStack { Label(session.timeRange, systemImage: "clock") Spacer() NavigationLink(value: LocationNavigationID(value: talk.locationID)) { locationLinkLabel } } /* .. */ } } Hereʼs the original code. It uses an HStack to put a label and a navigation link side by side.
  29. import SwiftUI struct SessionDetailView: View { var body: some View

    { ViewThatFits(in: .horizontal) { HStack { Label(session.timeRange, systemImage: "clock") Spacer() NavigationLink(value: LocationNavigationID(value: talk.locationID)) { locationLinkLabel } } VStack(alignment: .leading) { Label(session.timeRange, systemImage: "clock") NavigationLink(value: LocationNavigationID(value: talk.locationID)) { locationLinkLabel } } } /* .. */ } } In this case, use ViewThatFits. It is a built-in SwiftUI view. Give it several layouts. It checks them from top to bottom and uses the rst one that ts. Put your preferred layout rst and the fallback layout second. With an "if statement”, switching branches changes the view identity, so SwiftUI creates the view again. With ViewThatFits, you donʼt need if branches. The layout system chooses for you. fi fi fi Letʼs try it!
  30. Some text can't grow. What then? But some parts of

    the screen just canʼt get bigger. So, what can we do?
  31. For example, look at this banner. It shows the next

    session based on the current time. But if the text grows with Dynamic Type, the banner covers the session list behind it. So I stopped it from growing. But then my grandma canʼt read it. And I donʼt want to make my grandma cry.
  32. import SwiftUI struct ProgrammeCountdownBanner: View { var body: some View

    { bannerContent .accessibilityShowsLargeContentViewer { Label { VStack(alignment: .leading, spacing: 2) { Text(primaryTitleText) Text(primarySubtitleText) } } icon: { Image(systemName: iconName) } } /* .. */ } } In this case, use the Large Content Viewer. Add accessibilityShowsLargeContentViewer to the view, and provide the content you want to show. Now, press and hold it. The content appears larger in the centre of the screen.
  33. import SwiftUI struct ProgrammeCountdownBanner: View { var body: some View

    { bannerContent .accessibilityShowsLargeContentViewer { Label { VStack(alignment: .leading, spacing: 2) { Text(primaryTitleText) Text(primarySubtitleText) } } icon: { Image(systemName: iconName) } } /* .. */ } } My grandma is smiling again. The rule is simple: let content grow when possible. If it canʼt, / use the Large Content Viewer.
  34. Image, Dan Akiyama, Button. For example, imagine hearing this: “Image,

    Dan Akiyama, Button.” What does that mean? No idea, right?
  35. “Image, Dan Akiyama, Button.” The answer is: itʼs a link

    button on the speaker details screen. VoiceOver was only reading the imageʼs le name. But think about it. You already know youʼre on Dan Akiyamaʼs page. You donʼt need to hear his name again. fi You need to know where the link goes.
  36. “LinkedIn account Button” So now VoiceOver says, “LinkedIn account, button.”

    I hid the image from VoiceOver using accessibilityHidden. Then I gave the button the accessibility label “LinkedIn account.” My question was simple: What should someone hear when using this screen with VoiceOver?
  37. here is the implementation that gave me the most trouble.

    First, listen to this. [VIDEO] When VoiceOver focus enters the map, every swipe takes you to another place. But you only want directions to the venue. Swipe̶one place. Swipe̶another place. At rst, I tried to make the map easier to use. But then I stopped and asked a simpler question: fi What does the user actually need?
  38. After Hereʼs the improved version. Please watch. [VIDEO 2] In

    the end, I let Apple Maps handle the map. For VoiceOver, I replaced all the map elements with one button: “Open in Maps.” Now the user can choose whether to open Apple Maps. Apple Maps already works well with VoiceOver. This gives the user a better experience.
  39. "Add to favourite" One more thing: a change in state

    is also information. Take the favourite button. If it is not a favourite, VoiceOver says, “Add to favourites.” If it is already a favourite, it says, “Remove from favourites.” So users know the current state and what the button will do. "Remove from favourite"
  40. Generated with Gemini Hereʼs my grandma again. This time, sheʼs

    using a wheelchair. Just to be clear, my real grandma doesnʼt use one. Gemini added it. But this image made me think. Imagine an iPhone mounted on a wheelchair armrest. Or imagine one mounted sideways beside a bed. Many Switch Control users use xed mounts like these. They canʼt simply turn the device. Orientation also matters for people with low vision. fi Some people use landscape mode because it shows more words on each line.
  41. Let me show you the venue details screen in landscape

    mode. The map takes up most of the screen.
  42. There’s almost no space to scroll. Only this narrow area

    works. Thereʼs almost no space to scroll. Only this narrow area works.
  43. So I split the screen into two parts: the map

    on the left and the description on the right. Now thereʼs more space to scroll, and we can see more information at once.
  44. Every device. Every network. That's accessibility, too. In the end,

    I think about accessibility like this: Older devices. Di erent devices, such as iPhone, iPad, and Vision Pro maybe foldable Phone. And Slow networks. All of these are part of accessibility. Remember: “in every situation.” Take the demo appʼs map, for example. When the user is o ine, it shows a saved snapshot. MapKit has a cache, but cached data may be removed over time. The map in DemoApp rarely changes, ffl ff so saving a local copy made sense.
  45. Which one is tappable? Last quiz! Can you nd everything

    you can tap on this screen? fi Take a moment.
  46. Which one is tappable? ff Next, the speaker description. Itʼs

    cut o , so you might think, “Can I tap it to read more?”
  47. Which one is tappable? Next, the session rows. In most

    apps, you can tap them, so you might think you can tap these too.
  48. Which one is tappable? The speaker links look like URLs,

    so you might think you can tap them.
  49. Which one is tappable? And the venue name is tappable

    too. But almost no one notices. In fact, even I didnʼt notice it when I rst used the demo app. We built this screen, so we know what is tappable. But users donʼt. fi They might think, “How was I supposed to know?”
  50. Appleʼs consistent design teaches users whatʼs tappable. Apple uses consistent

    design, so users already know these patterns from other apps. They donʼt need to learn them again. Thatʼs why Apple provides the Human Interface Guidelines: to help apps stay consistent.
  51. “The speakerʼs-social-media-buttons” open Safari, so I added an external-link icon̶an

    arrow pointing up and to the right. I also made the links / blue to show that you can tap them. Why blue? Links on the web / have been blue for many years. So we have learned that blue text is often tappable. But there is one more reason. Remember my question at the beginning of this talk? “Why are iOS buttons blue?” Hereʼs the answer.
  52. Colour blindness Protanopia Deuteranopia Tritanopia red color blindness green color

    blindness blue color blindness https://speakerdeck.com/akidon0000/nazedehuorutogaqing-se-tint-colornoli-you-nipo-ru?slide=19 This is a simulation of colour-vision-de ciency, often called colour blindness. ff fi ff ff Di erent types a ect red, green, and blue in di erent ways. This can make some colours hard to tell apart.
  53. Colour blindness Protanopia Deuteranopia Tritanopia red color blindness green color

    blindness blue color blindness https://speakerdeck.com/akidon0000/nazedehuorutogaqing-se-tint-colornoli-you-nipo-ru?slide=19 In this colour-palette, blue changes the least across these simulations.
  54. Colour blindness Deuteranopia Protanopia Tritanopia green color blindness red color

    blindness blue color blindness approx. 5.7 % approx. 1.9 % approx. 0.4 % https://www.colourblindawareness.org/colour-blindness/types-of-colour-blindness/ https://www.ucl.ac.uk/mathematical-physical-sciences/sites/mathematical̲physical̲sciences/ les/guidelines̲for̲colour̲blindness.pdf Hereʼs the data. Green-related de ciencies are the most common, followed by red. Blue-related de ciencies are rare. So blue is easier to distinguish for many users. fi fi fi This is one reason why blue became the standard colour for links.
  55. And there's more. Those were the four main topics, but

    I also made many other improvements.
  56. Di erentiate Without Color Dynamic Type VoiceOver Rotate Color Contrast

    Reduce Transparency Reduce Motion Switch Control Voice Control Full Keyboard Access 44pt Tap Targets Gesture Alternatives Haptic Feedback etc… ff Beyond Dynamic Type and VoiceOver, I made many other improvements.
  57. Di erentiate Without Color Dynamic Type VoiceOver Rotate Color Contrast

    Reduce Transparency Reduce Motion Switch Control Voice Control Full Keyboard Access 44pt Tap Targets Gesture Alternatives Haptic Feedback etc… For example, my grandmother and I are not good at English, so I developed Japanese language support too. ff If youʼre interested, come talk to me after the session. Iʼd be happy to chat̶slowly!
  58. One more thing. One more thing. What is the most

    important in this session? You already know, right? …No. Itʼs not “Donʼt make Grandma sad.”
  59. Anticipate the experience. Itʼs to anticipate the experience̶to imagine the

    moment when information doesnʼt get through. But itʼs much easier to imagine what weʼve experienced ourselves. So̶here are three simple ways to gain that experience.
  60. First: Control Center. You can add accessibility controls here, like

    Text Size. Theyʼre only one swipe away, so you can try them anytime. Add them here and try them in other apps and in your own app.
  61. Second: the Action button. On iPhones with an Action button,

    you can use it to turn on an accessibility feature. Iʼve set mine to Colour Filters. One press, and the screen turns black and white. Now I can recreate the toggle quiz anytime!
  62. Third: the Accessibility Shortcut. Itʼs available on every iPhone. On

    iPhones with Face ID, just triple-click the side button. On older iPhones, triple-click the Home button. Iʼve set mine to VoiceOver. After this talk, turn on VoiceOver, close your eyes, and try your own app. ff The code you write tomorrow will be di erent.
  63. Next year, this stage could be yours. This challenge―honestly, I

    donʼt know if it will happen next year. But if it does… you could be the one standing on this stage.
  64. 2:20 PM - 3:00 PM 3:40 PM - 4:20 PM

    Hugh Owen C22 Great Hall, Arts Centre Next, Erica and Daniel will also talk about accessibility. If this talk made you curious, please check out their talks later.
  65. try! Swift TOKYO 2027 2 - 4 March 2027 https://x.com/tryswiftconf/status/2044089870885552258

    And this really is the last thing. I'm one of the organisers of try! Swift Tokyo in Japan. Our next event will be held from next March in Tokyo. Who here thinks Japan is far away? itʼs about ten thousand kilometres away. But I travelled the same distance to be here today, so you can do it too! If youʼd like, I can also help you plan sightseeing or meetups with our japanese community. Please feel free to come and talk to me.
  66. Diolch. Thank you. ありがとう icon for X Dan Akiyama (@akidon0000)

    GitHub I hope I say correct. And I'm joining karaoke tonight! Let's have fun together! Check Slack for details. Thank you so much.