Skip to content

feat(ios): expose editor-authored accessibility semantics to VoiceOver - #344

Merged
mfazekas merged 1 commit into
feat/rive-ios-experimentalfrom
feat/ios-semantics
Jul 16, 2026
Merged

feat(ios): expose editor-authored accessibility semantics to VoiceOver#344
mfazekas merged 1 commit into
feat/rive-ios-experimentalfrom
feat/ios-semantics

Conversation

@mfazekas

Copy link
Copy Markdown
Collaborator

Adds an optional semantics view prop (Semantics.Off / On / Automatic, default Off) that maps to RiveUIView.semantics on the experimental iOS backend, exposing accessibility semantics authored in the Rive editor (roles, labels, selection state) to VoiceOver (docs). Semantics-only prop changes are applied to the live view without rebuilding the artboard/state machine.

Semantics exist in the new Rive runtime only, so the legacy iOS backend accepts the prop and ignores it; both Android backends do the same until upstream rive-android ships semantics support.

Includes a Semantics (VoiceOver) example page using tabtest.riv from rive-runtime's semantic test assets. Verified on an iPhone 17 / iOS 26.5 simulator: with semantics on, the three tabs are exposed as accessibility buttons with the selected trait, and switching to off removes them.

Known upstream quirk found while verifying: re-enabling semantics on a live view (off → on) restarts the SDK's semantics manager (Enabling semantics + diff drains are logged) but the accessibility elements don't repopulate until the view is remounted — looks like the core doesn't re-deliver a full tree diff after a re-enable.

Adds an optional semantics view prop (Semantics.Off/On/Automatic, default
Off) that maps to RiveUIView.semantics on the experimental iOS backend,
so accessibility semantics authored in the Rive editor (roles, labels,
selection state) are exposed to VoiceOver. Semantics-only prop changes
apply to the live RiveUIView without rebuilding artboard/state machine.

Semantics exist in the new Rive runtime only, so the legacy iOS backend
accepts the prop and ignores it; Android (both backends) does the same
until upstream rive-android ships semantics support.

The Semantics example page uses tabtest.riv from rive-runtime's semantic
test assets (three tabs with roles and single-selection state).

Verified on an iPhone 17 / iOS 26.5 simulator: with semantics On the
tabs appear as accessibility buttons (Child / Parent / All, with the
selected trait); switching to Off removes them. Known upstream quirk:
re-enabling semantics on a live view (Off -> On) does not repopulate
elements until the view is remounted - the SDK restarts its semantics
manager but no full tree diff is re-delivered.
@mfazekas
mfazekas merged commit 9ff170c into feat/rive-ios-experimental Jul 16, 2026
15 checks passed
@mfazekas
mfazekas deleted the feat/ios-semantics branch July 16, 2026 10:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant