iOS 27 introduces the `accessibilityLinkedGroup` SwiftUI modifier, which lets developers connect multiple separate text views so VoiceOver and Speak Screen navigate across them seamlessly as a single continuous reading experience.
โข Eliminates the dead-end VoiceOver gap between separate text views (paragraphs, pages) when using line/word/character rotor navigation
โข Enables Speak Screen and VoiceOver Read All to flow continuously through paginated or split-paragraph content without stopping
โข Pairs with the existing `causesPageTurn` trait and `accessibilityScroll` to build a full audiobook-quality accessible reading experience
A paginated travel guide view that links two SwiftUI selectable Text views so VoiceOver navigates line-by-line across both paragraphs without interruption, and adds a Save Selection custom action to the edit rotor.
import SwiftUI
import Accessibility
struct ParagraphPageView: View {
@Namespace private var readingNamespace
@State private var savedText: String = ""
@State private var showSavedBanner: Bool = false
let morningText = "We started our morning in Lincoln Park, strolling through the trails and admiring the views of the Chicago skyline. Before we left the park, we made sure to stop at the free zoo."
let middayText = "At lunchtime, we walked along the Chicago river. The river-front path gave us great views of the city's magnificent architecture. Our favourite view was from the middle of the DuSable Bridge."
var body: some View {
ScrollView {
VStack(alignment: .leading, spacing: 24) {
Text("Morning")
.font(.title2.bold())
// First paragraph โ linked into the reading group
Text(morningText)
.textSelection(.enabled)
.accessibilityLinkedGroup(id: "page1", in: readingNamespace)
Text("Midday")
.font(.title2.bold())
// Second paragraph โ same group id and namespace
// VoiceOver line/word/character rotor moves across both
Text(middayText)
.textSelection(.enabled)
.accessibilityLinkedGroup(id: "page1", in: readingNamespace)
// causesPageTurn tells Speak Screen to advance the page
// when it reaches the end of this element
.accessibilityAddTraits(.causesPageTurn)
if showSavedBanner {
Text("Selection saved: \(savedText)")
.font(.footnote)
.foregroundStyle(.secondary)
.padding(8)
.background(.quaternary, in: RoundedRectangle(cornerRadius: 8))
.transition(.opacity)
}
}
.padding()
}
.navigationTitle("Chicago Guide")
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button("Save Selection") {
savedText = "(selection)"
withAnimation { showSavedBanner = true }
}
// Surface this action in the VoiceOver Edit rotor
.accessibilityCustomActions(category: .edit) {
AccessibilityCustomAction(name: "Save recommendation") {
savedText = "(selection)"
withAnimation { showSavedBanner = true }
return true
}
}
}
}
}
}
#Preview {
NavigationStack {
ParagraphPageView()
}
}Liquid Glass is Apple's new material and visual design language introduced in iOS 27, bringing translucent, refractive glass-like surfaces to system and custom UI elements. It replaces the frosted vibrancy aesthetic with a more dynamic, depth-aware material that responds to content beneath it.
PaperKit is Apple's full-featured canvas framework โ previously internal-only โ now publicly available in iOS/macOS/visionOS 27. It powers the drawing and markup experience in Notes, Preview, and Freeform, giving developers access to a complete pencil, shapes, images, and text canvas with a rich data model.
Xcode 27 introduces a fully customizable toolbar and theme system, untitled scratch projects, coding agent integration directly in the editor, and the new Device Hub for evaluating apps across simulators and physical devices side-by-side.
In-depth guide
SwiftUI & Liquid Glass in iOS 27 โThe `accessibilityLinkedGroup` modifier requires all linked views to share the same namespace and id โ mismatched ids silently break the linkage. On UIKit, the equivalent pre-existing API `accessibilityNextTextNavigationElement` / `accessibilityPreviousTextNavigationElement` was introduced in iOS 18 and still works. Custom actions added to the edit rotor must use the `.edit` category explicitly or they appear in the wrong rotor bucket.
No hardware constraints; available on all devices running iOS 27+
iOS 27 introduces new SwiftUI drag and drop APIs including reorderable, reorderContainer, dragContainer, and configuration modifiers that enable reordering within and across collections, multi-item drag, and fine-grained control over how data is transferred during drag and drop operations.