{ "$schema": "https://raw.githubusercontent.com/guitaripod/wwdc-sessions/master/schema/session.schema.json", "schemaVersion": 1, "id": "wwdc2026-221", "event": "wwdc2026", "eventName": "WWDC26", "year": 2026, "eventContentId": 221, "title": "Prepare your tvOS apps for Dynamic Type", "description": "Dynamic Type empowers people to comfortably read and interact with your app by letting them choose the text size that works best for them. You’ll learn how to get your app ready for Dynamic Type on tvOS through practical techniques for implementing font scaling and adapting your layouts for larger content. You’ll also discover how to optimize your media-focused interfaces like grids and carousels, ensuring a great experience for everyone who relies on different text sizes.", "url": "https://developer.apple.com/videos/play/wwdc2026/221", "sosumiURL": "https://sosumi.ai/videos/play/wwdc2026/221", "type": "Video", "publishedAt": "2026-06-08T14:00:00-07:00", "platforms": [ "tvOS" ], "keywords": [], "topics": [ "Audio & Video", "Accessibility & Inclusion" ], "primaryTopic": "Accessibility & Inclusion", "duration": 608, "hasTranscript": true, "transcriptWordCount": 1406, "availableLanguages": [ "eng", "fra", "jpn", "kor", "por", "spa", "zho" ], "media": { "hls": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/cmaf.m3u8", "downloadHLS": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/cmaf-download.m3u8", "downloadSD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/downloads/wwdc2026-221_sd.mp4", "downloadHD": "https://devstreaming-cdn.apple.com/videos/wwdc/2026/221/5/ada10ebd-34f8-4f57-92b5-4b3cd6281267/downloads/wwdc2026-221_hd.mp4", "duration": 608 }, "codeSnippets": [ { "title": "Adopt standard text styles", "language": "swift", "startTimeSeconds": 298, "code": "// Adopt standard text styles\n\nVStack(spacing: 20) {\n Text(\"Signup information\")\n .font(.caption.bold())\n .lineLimit(1)\n .foregroundStyle(.secondary)\n .frame(width: 300, alignment: .leading)\n HStack(alignment: .top, spacing: 40) { \n //* ... *//\n }\n}" }, { "title": "Use flexible constraints", "language": "swift", "startTimeSeconds": 310, "code": "// Adopt standard text styles\n\nVStack(spacing: 20) {\n Text(\"Signup information\")\n .font(.caption.bold())\n .lineLimit(1)\n .foregroundStyle(.secondary)\n .frame(maxWidth: .infinity, alignment: .leading)\n HStack(alignment: .top, spacing: 40) { \n /* ... */\n }\n}" }, { "title": "Dynamic Type with text styles in UIKit", "language": "swift", "startTimeSeconds": 355, "code": "// Hard coded text size in UIKit\n\ntitleLabel.font = UIFont.boldSystemFont(ofSize: 28)\n\n// Dynamic Type with text styles in UIKit\n\ntitleLabel.font = UIFont.preferredFont(forTextStyle: .headline)\ntitleLabel.adjustsFontForContentSizeCategory = true" }, { "title": "Adapt layout in response to dynamic type", "language": "swift", "startTimeSeconds": 429, "code": "// A view that shows a collection of movie posters\n\nstruct MovieShelf: View {\n @Environment(\\.dynamicTypeSize) private var dynamicTypeSize\n var body: some View {\n ScrollView(.horizontal) {\n LazyHStack(spacing: 40) {\n ForEach(Asset.allCases) { asset in\n Button { \n /* ... */\n } label: {\n asset.portraitImage\n Text(asset.title)\n }\n .containerRelativeFrame(\n .horizontal,\n count: dynamicTypeSize.isAccessibilitySize ? 4 : 6,\n spacing: 40)\n }\n }\n }\n }\n}" }, { "title": "Provide a conditional layout for when larger sizes are turned on", "language": "swift", "startTimeSeconds": 487, "code": "// A view that shows content in a card\n\nstruct CardContentView: View {\n @Environment(\\.dynamicTypeSize) private var dynamicTypeSize\n var asset: Asset\n\n var body: some View {\n let layout = dynamicTypeSize.isAccessibilitySize ?\n AnyLayout(VStackLayout(alignment: .leading, spacing: 10)) :\n AnyLayout(HStackLayout(alignment: .top, spacing: 10))\n layout {\n /* ... */\n }\n }\n}" }, { "title": "UIKit adaptive layout that responds to content size changes", "language": "swift", "startTimeSeconds": 511, "code": "// UIKit adaptive layout that responds to content size changes\n\nclass AdaptiveLayoutViewController: UIViewController {\n let stackView = UIStackView()\n\n override func viewDidLoad() {\n super.viewDidLoad()\n updateLayout()\n\n let sizeTraits: [UITrait] = [UITraitPreferredContentSizeCategory.self]\n registerForTraitChanges(sizeTraits, action: #selector(updateLayout))\n }\n\n private func updateLayout() {\n if traitCollection.preferredContentSizeCategory.isAccessibilityCategory {\n stackView.axis = .vertical\n } else {\n stackView.axis = .horizontal\n }\n }\n\n}" } ], "resources": [ { "title": "Applying custom fonts to text", "url": "https://developer.apple.com/documentation/SwiftUI/Applying-Custom-Fonts-to-Text", "type": "documentation", "description": "Add and use a font in your app that scales with Dynamic Type.", "sosumiURL": "https://sosumi.ai/documentation/SwiftUI/Applying-Custom-Fonts-to-Text", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/SwiftUI/Applying-Custom-Fonts-to-Text.json" }, { "title": "Scaling fonts automatically", "url": "https://developer.apple.com/documentation/UIKit/scaling-fonts-automatically", "type": "documentation", "description": "Scale text in your interface automatically using Dynamic Type.", "sosumiURL": "https://sosumi.ai/documentation/UIKit/scaling-fonts-automatically", "doccJSON": "https://developer.apple.com/tutorials/data/documentation/UIKit/scaling-fonts-automatically.json" } ], "path": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/", "files": { "metadata": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/metadata.json", "readme": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/README.md", "transcript": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/transcript.md", "transcriptJSON": "sessions/wwdc2026/221-prepare-your-tvos-apps-for-dynamic-type/transcript.json" } }