visionOS 27 introduces ClippingComponent and enhanced ManipulationComponent placement patterns in RealityKit, enabling multiple users in a SharePlay session to simultaneously manipulate, disassemble, and cross-section structured 3D assemblies in shared space.
⢠ClippingComponent is new in visionOS 27, letting you define an axis-aligned bounding box that discards geometry outside its bounds at render time ā making complex interiors accessible without destroying the mesh
⢠Placing ManipulationComponent at different levels of an entity hierarchy dynamically switches an assembly between "single manipulable object" and "individually grabbable parts" with no geometry changes
⢠Combining SharePlay with structured RealityKit hierarchies enables true multi-user spatial collaboration on CAD, architecture, logistics, and any multidimensional dataset
Loads a hierarchical 3D model and toggles between treating it as one manipulable object versus individually grabbable sub-parts by relocating ManipulationComponent and InputTargetComponent through the entity tree, then applies a ClippingComponent to reveal the interior.
import SwiftUI
import RealityKit
// MARK: - Assembly open/close helpers
extension Entity {
/// Move manipulation to children so each part is individually grabbable.
func openAssembly() {
components.remove(ManipulationComponent.self)
components.remove(InputTargetComponent.self)
for child in children {
var manipulation = ManipulationComponent()
manipulation.releaseBehavior = .stay
child.components.set(manipulation)
child.components.set(InputTargetComponent(allowedInputTypes: .all))
// CollisionComponent is required for input to work.
if child.components[CollisionComponent.self] == nil {
child.generateCollisionShapes(recursive: false)
}
}
}
/// Collapse back to a single manipulable root entity.
func closeAssembly() {
for child in children {
child.components.remove(ManipulationComponent.self)
child.components.remove(InputTargetComponent.self)
}
var manipulation = ManipulationComponent()
manipulation.releaseBehavior = .stay
components.set(manipulation)
components.set(InputTargetComponent(allowedInputTypes: .all))
}
/// Add a ClippingComponent that clips to the positive-Z half of the entity.
func enableClipping() {
guard let bounds = self.visualBounds(relativeTo: self) as BoundingBox? else { return }
let halfDepth = (bounds.max.z + bounds.min.z) / 2
let clippedBounds = BoundingBox(
min: SIMD3(bounds.min.x, bounds.min.y, bounds.min.z),
max: SIMD3(bounds.max.x, bounds.max.y, halfDepth)
)
var clipping = ClippingComponent(bounds: clippedBounds)
clipping.shouldClipChildren = true
clipping.shouldClipSelf = true
components.set(clipping)
}
func disableClipping() {
components.remove(ClippingComponent.self)
}
}
// MARK: - SwiftUI View
struct AssemblyView: View {
@State private var rootEntity: Entity? = nil
@State private var isOpen = false
@State private var isClipped = false
var body: some View {
RealityView { content in
let root = try? await Entity(named: "AirPodsProAssembly", in: .main)
if let root {
var manipulation = ManipulationComponent()
manipulation.releaseBehavior = .stay
root.components.set(manipulation)
root.components.set(InputTargetComponent(allowedInputTypes: .all))
root.generateCollisionShapes(recursive: true)
content.add(root)
rootEntity = root
}
}
.toolbar {
ToolbarItemGroup(placement: .bottomOrnament) {
Button(isOpen ? "Close Assembly" : "Open Assembly") {
guard let root = rootEntity else { return }
isOpen ? root.closeAssembly() : root.openAssembly()
isOpen.toggle()
}
Button(isClipped ? "Remove Clip" : "Clip Interior") {
guard let root = rootEntity else { return }
isClipped ? root.disableClipping() : root.enableClipping()
isClipped.toggle()
}
}
}
}
}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
RealityKit & USDKit in iOS 27 ā⢠CollisionComponent is mandatory for ManipulationComponent to receive input events ā it is easy to forget and results in non-interactive entities with no error ⢠ClippingComponent.shouldClipChildren defaults to false; forgetting to set it true on a parent entity means children will not be clipped ⢠ClippingComponent bounds are expressed in entity local space, not world space ā coordinate frame conversions are required when driving bounds from world-space drag gestures ⢠releaseBehavior must be set to .stay on ManipulationComponent or released parts will snap back to origin
Requires Apple Vision Pro; SharePlay collaboration requires all participants to be on visionOS 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.