Spatial Gestures (visionOS)
visionOS uses eye tracking + hand gestures instead of touch.
Tap Gesture (look + pinch)
Model3D(named: "Globe")
.gesture(TapGesture().targetedToAnyEntity().onEnded { value in
handleTap(value.entity)
})
Drag Gesture (pinch + move)
RealityView { content in
// entity setup
}
.gesture(DragGesture().targetedToAnyEntity().onChanged { value in
value.entity.position = value.convert(value.location3D, from: .local, to: .scene)
})
Long Press
SpatialTapGesture()
.onEnded { value in
handleSpatialTap(at: value.location)
}
Indirect Gestures (SwiftUI views)
Standard SwiftUI gestures work on 2D windows via eye tracking:
Button("Action") { doSomething() }
.hoverEffect() // REQUIRED — visual feedback for eye tracking
Toggle("Setting", isOn: $setting)
.hoverEffect()
Rules
- ALL interactive SwiftUI elements MUST have
.hoverEffect()for eye tracking feedback - Use
TapGesture().targetedToAnyEntity()for 3D entity interaction - Use
DragGesture().targetedToAnyEntity()for spatial dragging - Standard SwiftUI gestures work on 2D window content via eye tracking
- No haptic feedback available — use visual and audio feedback instead
- Minimum interactive target size: 60x60 points
Scan to join WeChat group