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.
iOS 27 brings significant updates to Live Activities and the Dynamic Island, including new expanded presentations, richer interactivity via App Intents directly from the island, and updated layout APIs for more expressive minimal and compact views.
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 enforces stricter adaptivity requirements for UIKit apps, making iPhone apps fully resizable in iPhone Mirroring and on iPad, while introducing new navigation bar minimization controls, sidebar opt-in for iPhone tab bars, and prominent tab customization.