{"$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/transcript.schema.json", "id": "wwdc2026-221", "language": "eng", "source": "https://developer.apple.com/videos/play/wwdc2026/221", "wordCount": 1406, "segments": [{"start": 7.0, "text": "Hi, I'm Isis, and I'm an engineering manager on the accessibility team."}, {"start": 12.0, "text": "This year, there is great news for accessibility on tvOS 27."}, {"start": 18.0, "text": "Large Text support is now available,"}, {"start": 20.0, "text": "bringing system-wide text scaling to every app on the platform."}, {"start": 25.0, "text": "Many people need or prefer different text sizes,"}, {"start": 28.0, "text": "and making your app dynamic helps everyone get a great experience."}, {"start": 32.0, "text": "Your tvOS app customers have been waiting for this accessibility feature."}, {"start": 36.0, "text": "And I'll show you how to make the most out of it in your apps."}, {"start": 40.0, "text": "In addition, you'll be able to indicate support for Larger Text"}, {"start": 43.0, "text": "in your Accessibility Nutrition Labels for tvOS in the App Store."}, {"start": 48.0, "text": "This is a great way to reach users who specifically look for accessible apps"}, {"start": 52.0, "text": "that support larger text."}, {"start": 55.0, "text": "In this session, I'll start by covering how Large Text works on tvOS"}, {"start": 59.0, "text": "and where people can find it."}, {"start": 62.0, "text": "Then, I'll go into identifying small parts of your app"}, {"start": 65.0, "text": "that you may need to adjust for larger text sizes."}, {"start": 69.0, "text": "And finally, I'll touch on a few examples"}, {"start": 72.0, "text": "of how to adapt layout in response to text size."}, {"start": 76.0, "text": "Let's start with an overview."}, {"start": 77.0, "text": "If you're familiar with Dynamic Type on iOS,"}, {"start": 80.0, "text": "you have a head start!"}, {"start": 81.0, "text": "Dynamic Type works the same way on tvOS."}, {"start": 85.0, "text": "UIKit and SwiftUI can adapt text sizes automatically"}, {"start": 90.0, "text": "based on what someone prefers."}, {"start": 92.0, "text": "This gives people control over the text size"}, {"start": 94.0, "text": "to match their needs and comfort."}, {"start": 98.0, "text": "People can turn on larger text sizes in the Settings app."}, {"start": 101.0, "text": "By navigating to Accessibility, Display, then Text Size."}, {"start": 107.0, "text": "They'll have the option of choosing text sizes"}, {"start": 109.0, "text": "starting at Large all the way up to Accessibility XXXL."}, {"start": 116.0, "text": "I'm working on a media app"}, {"start": 117.0, "text": "that lets people discover and watch their favorite movies."}, {"start": 121.0, "text": "Here's how this app adapts to these larger text sizes."}, {"start": 125.0, "text": "This media app has a tab bar at top for navigation."}, {"start": 128.0, "text": "There's a large title, with a few action buttons,"}, {"start": 132.0, "text": "and a gallery of movie posters to explore in a collection view below that."}, {"start": 136.0, "text": "With larger text sizes turned on, the navigation title at the top"}, {"start": 140.0, "text": "has become much larger."}, {"start": 143.0, "text": "In the tab bar, each label is now bigger,"}, {"start": 146.0, "text": "and all of the text throughout the interface has scaled up significantly."}, {"start": 151.0, "text": "Standard UIKit and SwiftUI components"}, {"start": 154.0, "text": "like Labels, Buttons and Navigation tabBars"}, {"start": 157.0, "text": "handle this automatically."}, {"start": 160.0, "text": "For your apps, your job is just to identify and update"}, {"start": 163.0, "text": "any custom elements that may need attention."}, {"start": 167.0, "text": "When examining your app with Large Text,"}, {"start": 169.0, "text": "there are a few types of issues to identify."}, {"start": 172.0, "text": "When your app runs with larger text sizes,"}, {"start": 174.0, "text": "you'll want to ensure that you avoid fixed font sizes"}, {"start": 178.0, "text": "that don't allow your text to scale."}, {"start": 181.0, "text": "Interfaces that don't adapt to dynamic type,"}, {"start": 183.0, "text": "like hard-coded sizes or constraints,"}, {"start": 185.0, "text": "may cause issues like truncation of text"}, {"start": 189.0, "text": "or clipping of UI elements."}, {"start": 191.0, "text": "You may also need to adjust layouts for the padding and spacing needed"}, {"start": 195.0, "text": "when some elements grow to larger sizes."}, {"start": 199.0, "text": "Here's an example from my media app"}, {"start": 201.0, "text": "where the description of a movie is displayed."}, {"start": 204.0, "text": "There is a title shown at the top,"}, {"start": 206.0, "text": "with text labels and controls towards the bottom."}, {"start": 210.0, "text": "With text set to the largest size, most of the text has grown larger…"}, {"start": 215.0, "text": "But, there's one text element on the left that isn't scaling."}, {"start": 220.0, "text": "That is the caption that reads \"Signup information\""}, {"start": 223.0, "text": "above the controls that let someone sign up,"}, {"start": 225.0, "text": "buy, or rent a movie."}, {"start": 228.0, "text": "Now, a caption like this may have hard-coded text sizes"}, {"start": 231.0, "text": "for a specific layout reason."}, {"start": 233.0, "text": "For example, it might have originally been in a container"}, {"start": 237.0, "text": "with static dimensions or rigid constraints."}, {"start": 240.0, "text": "While this can seem appealing for creating predictable layouts,"}, {"start": 243.0, "text": "it's not recommended."}, {"start": 245.0, "text": "This approach lacks flexibility and can't adapt to larger text."}, {"start": 250.0, "text": "Instead, adapt the layout to be flexible and remove the hard-coded values."}, {"start": 255.0, "text": "Here is the code representing the Description View of my media app."}, {"start": 260.0, "text": "It has a VStack, containing the \"Signup information\" caption,"}, {"start": 264.0, "text": "and an HStack containing the buttons"}, {"start": 266.0, "text": "and other text information about the movie."}, {"start": 269.0, "text": "This code contains a few different challenges for larger text."}, {"start": 273.0, "text": "It specifies a fixed font size, which will not adapt"}, {"start": 277.0, "text": "when someone changes their size preference."}, {"start": 281.0, "text": "And on the Text view,"}, {"start": 282.0, "text": "there is a fixed width constraint to 300 points."}, {"start": 286.0, "text": "As text grows, 300 points may not be wide enough for the text,"}, {"start": 290.0, "text": "which could lead to text truncation."}, {"start": 293.0, "text": "To make this caption adjust to larger text sizes,"}, {"start": 296.0, "text": "I'll replace the hard-coded font style with a semantic text style."}, {"start": 300.0, "text": "In this case, I'll use \"caption\"."}, {"start": 303.0, "text": "With those changes, the text size is now dynamically growing,"}, {"start": 307.0, "text": "but the content is now truncated."}, {"start": 311.0, "text": "To fix this, replace fixed widths with flexible constraints"}, {"start": 314.0, "text": "that let the view grow as needed."}, {"start": 317.0, "text": "On the text view, I'll replace the fixed width"}, {"start": 320.0, "text": "with the parameter maxWidth"}, {"start": 322.0, "text": "and set it to infinity."}, {"start": 324.0, "text": "This tells SwiftUI to use as much width as needed for the content."}, {"start": 329.0, "text": "With those changes, my text view scales beautifully with larger text,"}, {"start": 334.0, "text": "and has enough space to display its content."}, {"start": 337.0, "text": "Perfect!"}, {"start": 338.0, "text": "To find these types of common issues in your app,"}, {"start": 341.0, "text": "search for hard-coded text sizes"}, {"start": 343.0, "text": "and migrate to standard styles instead."}, {"start": 347.0, "text": "Search your app for hard-coded height and width constraints"}, {"start": 350.0, "text": "and use flexible constraints to allow your content to grow."}, {"start": 355.0, "text": "If you're using UIKit, the approach is similar"}, {"start": 358.0, "text": "with one additional step."}, {"start": 360.0, "text": "Replace hard-coded fonts with text styles,"}, {"start": 363.0, "text": "and set adjustsFontForContentSizeCategory to true."}, {"start": 368.0, "text": "This tells UIKit to automatically update when preferences change."}, {"start": 373.0, "text": "Sometimes fixing hard-coded values isn't enough."}, {"start": 377.0, "text": "You may want to adapt the layout in response to larger text,"}, {"start": 380.0, "text": "while preserving the original layout for default sizes."}, {"start": 385.0, "text": "Consider this collection view."}, {"start": 387.0, "text": "It contains six movie posters with a title underneath each."}, {"start": 391.0, "text": "With a standard text size,"}, {"start": 393.0, "text": "the full title fits comfortably in the space below the image."}, {"start": 397.0, "text": "With Large Text enabled,"}, {"start": 399.0, "text": "there isn't enough room to fit six titles horizontally."}, {"start": 403.0, "text": "This layout will need to be adapted when the text is larger."}, {"start": 408.0, "text": "Here is the SwiftUI code for the view."}, {"start": 410.0, "text": "It presents a horizontal scroll view, with a LazyHStack."}, {"start": 415.0, "text": "Inside a container, I have a button for each cell."}, {"start": 419.0, "text": "To adapt this layout,"}, {"start": 421.0, "text": "I will first read the dynamicTypeSize environment key path."}, {"start": 425.0, "text": "Then, I'll change the columnCount parameter on the cell"}, {"start": 429.0, "text": "in the containerRelativeFrame modifier."}, {"start": 433.0, "text": "When larger text sizes are enabled,"}, {"start": 435.0, "text": "I'll set the layout to show 4 columns at a time, instead of 6."}, {"start": 441.0, "text": "This provides wider cell dimensions and gives each title more room to grow."}, {"start": 446.0, "text": "To accommodate even longer text, consider a custom marquee strategy."}, {"start": 452.0, "text": "Here's another example where I'll adjust layout in this app."}, {"start": 456.0, "text": "This part of my app contains cards for different types of content,"}, {"start": 460.0, "text": "like a video of a beach, or a video of camping."}, {"start": 464.0, "text": "Each of these content cards contains an image,"}, {"start": 466.0, "text": "the title, and a subtitle."}, {"start": 469.0, "text": "With larger text, there isn't enough visual padding between elements,"}, {"start": 473.0, "text": "and text is easily truncated with the space that it has."}, {"start": 478.0, "text": "One solution is to provide a conditional layout"}, {"start": 480.0, "text": "for when larger sizes are turned on."}, {"start": 483.0, "text": "Here's how a conditional layout can be achieved in SwiftUI."}, {"start": 487.0, "text": "First, read the dynamicTypeSize environment value"}, {"start": 490.0, "text": "to detect when accessibility sizes are turned on."}, {"start": 494.0, "text": "Then, create a VStackLayout or an HStackLayout"}, {"start": 497.0, "text": "depending on whether larger text is being used."}, {"start": 501.0, "text": "AnyLayout lets you abstract over these two types."}, {"start": 505.0, "text": "Use the new layout like any other stack."}, {"start": 507.0, "text": "It will dynamically switch between horizontal and vertical"}, {"start": 510.0, "text": "depending on the text size."}, {"start": 513.0, "text": "In UIKit, use UIStackView and update the axis property"}, {"start": 517.0, "text": "based on preferredContentSizeCategory. isAccessibilityCategory."}, {"start": 524.0, "text": "Call registerForTraitChanges and pass UITraitPreferredContentSizeCategory"}, {"start": 529.0, "text": "to update your layout in response to size changes while your app is running."}, {"start": 535.0, "text": "Here it is in action in my app's content cards."}, {"start": 539.0, "text": "When larger text sizes are enabled, the layout switches to a vertical stack."}, {"start": 544.0, "text": "This lets the title and subtitle grow to the entire width of the cell,"}, {"start": 548.0, "text": "rather than sharing the width with the image."}, {"start": 551.0, "text": "This layout also allows the cells to become taller to provide more room"}, {"start": 556.0, "text": "for the content."}, {"start": 558.0, "text": "Now you're ready to test your app with larger text sizes on tvOS."}, {"start": 563.0, "text": "Discover where you can make refinements by using system text styles"}, {"start": 566.0, "text": "and tailoring your layouts to prioritize text legibility."}, {"start": 571.0, "text": "Here's your action plan."}, {"start": 573.0, "text": "Use standard text styles instead of hard-coded fonts."}, {"start": 577.0, "text": "Test systematically with Large Text enabled."}, {"start": 582.0, "text": "Adapt layouts when needed for best experience."}, {"start": 586.0, "text": "And indicate support for Larger Text"}, {"start": 588.0, "text": "in your app's Accessibility Nutrition Labels for tvOS."}, {"start": 594.0, "text": "Now it's your turn to make your tvOS app accessible for everyone!"}, {"start": 598.0, "text": "Thanks for watching!"}]}