View in English

  • Apple Developer
    • Get Started

    Explore Get Started

    • Overview
    • Learn
    • Apple Developer Program

    Stay Updated

    • Latest News
    • Hello Developer
    • Platforms

    Explore Platforms

    • Apple Platforms
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store

    Featured

    • Design
    • Distribution
    • Games
    • Accessories
    • Web
    • Home
    • CarPlay
    • Technologies

    Explore Technologies

    • Overview
    • Xcode
    • Swift
    • SwiftUI

    Featured

    • Accessibility
    • App Intents
    • Apple Intelligence
    • Games
    • Machine Learning & AI
    • Security
    • Xcode Cloud
    • Community

    Explore Community

    • Overview
    • Meet with Apple events
    • Community-driven events
    • Developer Forums
    • Open Source

    Featured

    • WWDC
    • Swift Student Challenge
    • Developer Stories
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Centers
    • Documentation

    Explore Documentation

    • Documentation Library
    • Technology Overviews
    • Sample Code
    • Human Interface Guidelines
    • Videos

    Release Notes

    • Featured Updates
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • tvOS
    • Xcode
    • Downloads

    Explore Downloads

    • All Downloads
    • Operating Systems
    • Applications
    • Design Resources

    Featured

    • Xcode
    • TestFlight
    • Fonts
    • SF Symbols
    • Icon Composer
    • Support

    Explore Support

    • Overview
    • Help Guides
    • Developer Forums
    • Feedback Assistant
    • Contact Us

    Featured

    • Account Help
    • App Review Guidelines
    • App Store Connect Help
    • Upcoming Requirements
    • Agreements and Guidelines
    • System Status
  • Quick Links

    • Events
    • News
    • Forums
    • Sample Code
    • Videos
 

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Todos los videos
  • Información

Más videos

  • Información
  • Resumen
  • Código
  • Mejora la accesibilidad de tu app de lectura

    Descubre cómo crear experiencias de lectura optimizadas para VoiceOver, Leer pantalla en voz alta y mucho más. Descubre cómo ofrecer una selección de texto intuitiva, una navegación clara entre líneas y párrafos, y una lectura fluida a través de elementos individuales y varias páginas.

    Capítulos

    • 0:01 - Introduction
    • 1:26 - Characteristics
    • 3:45 - Standard views
    • 14:05 - Custom text

    Recursos

    • accessibilityNextTextNavigationElement
    • editCategory
    • accessibilityLinkedGroup(id:in:)
    • causesPageTurn
    • UITextInput
    • Accessibility for UIKit
      • Video HD
      • Video SD

    Videos relacionados

    WWDC19

    • Creating an Accessible Reading Experience
  • Buscar este video…
    • 7:29 - Link text elements together with navigation APIs

      // Link text elements together with navigation APIs
      
      import UIKit
      
      class TravelGuidePageController: UIViewController {
      
          var paragraphs: [TravelGuideParagraph]
      
          func configureNavigationElements() {
              for (index, paragraph) in paragraphs.enumerated() {
                  if index + 1 < paragraphs.count {
                      paragraph.accessibilityNextTextNavigationElement = paragraphs[index + 1]
                  }
                  if index - 1 >= 0 {
                      paragraph.accessibilityPreviousTextNavigationElement = paragraphs[index - 1]
                  }
              }
          }
      }
    • 7:59 - Link text elements together with a linked group

      // Link text elements together with a linked group
      
      import SwiftUI
      
      struct PageView : View {
          @Namespace private var pageNamespace
          var paragraphs: [String
          var pageNumber: Int
      
          var body: some View {
              Text(paragraphs[0])
                  .textSelection(.enabled)
                  .accessibilityLinkedGroup(id: pageNumber, in: pageNamespace)
      
              Text(paragraphs[1])
                  .textSelection(.enabled)
                  .accessibilityLinkedGroup(id: pageNumber, in: pageNamespace)
          }
      }
    • 9:50 - Turn pages automatically after reading

      // Turn pages automatically after reading
      
      import UIKit
      
      class TravelGuidePageController: UIViewController {
      
          override func viewDidLoad() {
              super.viewDidLoad()
              self.lastParagraphView.accessibilityTraits.insert(.causesPageTurn)
          }
      
          override func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool {
              moveToPage(direction)
              var scrollString = "Page \(currentPage) of \(pages.count)"
              UIAccessibility.post(notification: .pageScrolled, argument: scrollString)
              return true
          }
      }
    • 11:45 - Add actions to the editor rotor

      // Add actions to the editor rotor
      
      import UIKit
      
      class TravelGuideParagraph: UITextView {
      
          override var accessibilityCustomActions: [UIAccessibilityCustomAction]? {
              get {
                  let saveAction = UIAccessibilityCustomAction(name: "Save Recommendation") { _ in
                      self.saveRecommendation()
                  }
                  saveAction.category = UIAccessibilityCustomAction.editCategory
                  return (super.accessibilityCustomActions ?? []) + [saveAction]
              }
              set { }
          }
      
          private func saveRecommendation() -> Bool {
              ...
              return true
          }
      }
    • 16:10 - Adopt UITextInput

      // Adopt UITextInput
      
      import UIKit
      
      class ScannedPage: UIView, UITextInput {
      
          override init(frame: CGRect) {
              super.init(frame: frame)
              let interaction = UITextInteraction(for: .nonEditable)
              interaction.textInput = self
              addInteraction(interaction)
          }
         
          func selectionRects(for range: UITextRange) -> [UITextSelectionRect] {
              var rects: [UITextSelectionRect] = []
      
              let startLine = lineIndex(for: range.start)
              let endLine = lineIndex(for: range.end)
      
              for line in startLine...endLine {
                  let rect = selectionRectFromImage(for: range, in: line)
                  rects.append(rect)
              }
      
              return rects
          }
        
          func text(in range: UITextRange) -> String? {
              let nsRange = nsRange(from: range)
              guard let range = Range(nsRange, in: scannedText) else {
                  return nil
              }
              return String(scannedText[range])
          }
      
          var tokenizer: any UITextInputTokenizer { CustomHandwritingTokenizer(textInput: self) }
      
          weak var inputDelegate: UITextInputDelegate?
        
            var selectedTextRange: UITextRange? {
              // Update visuals when assistive technologies change selection
              willSet { inputDelegate?.selectionWillChange(self) }
              didSet { inputDelegate?.selectionDidChange(self) }
          }
        
      }
    • 0:01 - Introduction
    • What makes reading apps an accessibility challenge distinct from UI navigation, and what the session covers — the characteristics of a great reading experience, extending UIKit and SwiftUI text views, and making custom text accessible.

    • 1:26 - Characteristics
    • Reading apps present unique accessibility challenges distinct from standard UI navigation, requiring fluid movement through text for technologies like VoiceOver and Speak Screen. This session covers three goals — granular navigation, continuous reading, and text selection — using UIKit, SwiftUI, and AppKit APIs.

    • 3:45 - Standard views
    • UITextView, SwiftUI's TextEditor and selectable Text, and NSTextView on macOS all adopt UITextInput automatically, providing line, word, and character navigation and accessible text selection. The accessibilityNextTextNavigationElement and accessibilityPreviousTextNavigationElement APIs (and the new accessibilityLinkedGroup for SwiftUI) connect separate text elements so VoiceOver can move between them seamlessly, while the causesPageTurn trait provides page turning automatically during read-all gestures.

    • 14:05 - Custom text
    • When using custom or custom-rendered text — such as scanned images — adopting the full UITextInput protocol gives VoiceOver and Speak Screen the same granular navigation and selection capabilities as native text views. This requires implementing text geometry methods like selectionRects(for:), a tokenizer, and text range methods, and can be paired with UITextInteraction for visible selection handles.

Developer Footer

  • Videos
  • WWDC26
  • Mejora la accesibilidad de tu app de lectura
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    • App Store
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • Apple Intelligence
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Downloads
    • Sample Code
    • Videos
    Open Menu Close Menu
    • Help Guides & Articles
    • Contact Us
    • Forums
    • Feedback & Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • Mini Apps Partner Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Read the latest news.
    Get the Apple Developer app.
    Copyright © 2026 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines