Sample CodeiOS, iPadOSReviewed 2026-07-21View on Apple Developer

Creating screen annotations for objects in an AR experience

At a glance

Item Summary
Purpose Annotate an AR experience with virtual sticky notes that you display onscreen over real and virtual objects.
App architecture A Swift sample with the source-visible chain AppDelegateViewControllerARKit APIs.
Main patterns View-controller organization, Protocol-oriented abstraction, Delegate or data-source callbacks
Project style 14 scanned source file(s) across Swift, organized around ranked entry, type, and file boundaries.

Project structure

Source bundle/
└── ScreenSpace-Sample/
    ├── AppDelegate.swift
    └── ViewController/
        ├── Components/
        │   └── ScreenSpaceComponent.swift
        ├── ViewController.swift
        ├── Views/
        │   ├── GradientView.swift
        │   ├── StickyNoteView.swift
        │   └── MessageLabel.swift
        ├── Delegates/
        │   ├── ViewController+ARCoachingOverlayDelegate.swift
        │   └── ViewController+UITextViewDelegate.swift
        ├── Entities/
        │   └── StickyNoteEntity.swift
        ├── Gestures/
        │   └── ViewController+Gestures.swift
        └── Utilities/
            ├── Keyboard+Helpers.swift
            └── SIMD+Helpers.swift

Structure observations

  • Architecturally prominent files are ranked from entry points and role-named declarations; resource-only paths are omitted.
  • Primary languages: Swift.
  • The verified tree contains 6 project/configuration file(s) and 9 source declaration(s).

Overall architecture

Reference code

ScreenSpace-Sample/AppDelegate.swift:10 — architecture anchor

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    // ...
}

Interpretation

The arrows summarize the source-visible entry, role-named types or folders, and framework direction; when nodes come from structural folders, the sequence is a high-level interpretation rather than proof that every adjacent node calls the next. Ownership is claimed only where the next section cites a stored property or assignment. The diagram is intentionally limited to the dominant path into ARKit.

Ownership and state

Ownership evidence

ScreenSpace-Sample/AppDelegate.swift:13 — stored dependency or nearest verified ownership anchor

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    // ...
    var window: UIWindow?
    // ...
}
Owner Object or state Relationship Mutation authority
AppDelegate UIWindow (window) stores or receives App/module collaborators
ScreenSpaceComponent StickyNoteView (view) stores or receives App/module collaborators
ScreenSpaceComponent Projection (projection) stores or receives App/module collaborators
Projection CGPoint (projectedPoint) owns value state Initialized by the owner; the binding is immutable

Composition arrows indicate a source-visible construction expression or locally owned value state; aggregation means the owner stores or receives a dependency without proving exclusive lifetime ownership.

Class and protocol design

ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift:11 — representative type boundary

protocol HasScreenSpaceView: Entity {
    var screenSpaceComponent: ScreenSpaceComponent { get set }
}
Type Responsibility Depends on or conforms to
AppDelegate Receives callback-driven events UIResponder, UIApplicationDelegate
HasScreenSpaceView Defines a capability or collaboration contract Entity
ScreenSpaceComponent Stores entity-component data or behavior Component
ViewController View lifecycle, callbacks, and feature coordination UIViewController, ARSessionDelegate
GradientView User-interface presentation and input forwarding UIView
StickyNoteView User-interface presentation and input forwarding UIView
Projection Represents a feature value or composable behavior Concrete collaborators/imported frameworks
StickyNoteEntity Represents feature data Entity, HasAnchoring, HasScreenSpaceView
MessageLabel Owns feature behavior and collaborator lifecycle UILabel

The source explicitly defines local protocol relationships: StickyNoteEntityHasScreenSpaceView.

Access control

Symbol Access Verified effect Likely rationale
clearPlaceholderText (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:56) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
focusOnStickyView (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:64) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
unfocusOnStickyView (ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:70) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.
insertNewSticky (ScreenSpace-Sample/ViewController/Gestures/ViewController+Gestures.swift:47) fileprivate Use is restricted to this source file. Inference: share with same-file helpers or extensions without exposing the symbol module-wide.

Reference code

ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift:56 — representative boundary

    fileprivate func clearPlaceholderText(_ stickyView: StickyNoteView, _ textView: UITextView) {
        // ...
    }

Swift declarations without a modifier are internal; explicit private, fileprivate, private(set), public, or open entries above are interpreted by language semantics. Objective-C/C samples instead rely on header and implementation boundaries, which are not equivalent to Swift lexical privacy.

Logic ownership and placement

Logic Owning type or file Placement rationale
Stores entity-component data or behavior ScreenSpaceComponent The source’s Component suffix makes this role explicit.
View lifecycle, callbacks, and feature coordination ViewController The source’s Controller suffix makes this role explicit.
Receives callback-driven events AppDelegate The source’s Delegate suffix makes this role explicit.
User-interface presentation and input forwarding GradientView, HasScreenSpaceView, StickyNoteView The source’s View suffix makes this role explicit.

Design patterns

Pattern Source evidence Purpose or tradeoff
View-controller organization ScreenSpace-Sample/ViewController/ViewController.swift:13 A controller is the verified coordination boundary; this is MVC-style only where a separate model is present.
Protocol-oriented abstraction ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift:12 A local protocol and concrete conformance create an explicit capability boundary.
Delegate or data-source callbacks ScreenSpace-Sample/AppDelegate.swift:11 Callback protocols invert event delivery back into the sample’s owner.

Naming conventions

  • Types: Component: ScreenSpaceComponent; Controller: ViewController; Delegate: AppDelegate; View: GradientView, HasScreenSpaceView, StickyNoteView.
  • Protocols: HasScreenSpaceView.
  • Methods: application, getCenterPoint, setPositionCenter, animateTo, updateScreenPosition, viewDidLoad, viewWillAppear, viewDidAppear.
  • Files: ScreenSpace-Sample/AppDelegate.swift, ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift, ScreenSpace-Sample/ViewController/ViewController.swift, ScreenSpace-Sample/ViewController/Views/GradientView.swift, ScreenSpace-Sample/ViewController/Views/StickyNoteView.swift, ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift.

Architecture takeaways

  • AppDelegate is the main source-visible entry or composition anchor for this sample.
  • Framework work reaches UIKit, ARKit, RealityKit through a deliberately small high-level chain; the detailed API graph remains inside the cited implementation files.
  • Stored-property evidence identifies lifecycle collaboration; it does not by itself prove exclusive object ownership.
  • Access-control conclusions separate verified language visibility from the likely design rationale.
  • Local protocol relationships provide an explicit substitution boundary.

Source map

Source file Relevant symbols
ScreenSpace-Sample/AppDelegate.swift AppDelegate
ScreenSpace-Sample/ViewController/Components/ScreenSpaceComponent.swift HasScreenSpaceView, ScreenSpaceComponent, Projection
ScreenSpace-Sample/ViewController/ViewController.swift ViewController
ScreenSpace-Sample/ViewController/Views/GradientView.swift GradientView
ScreenSpace-Sample/ViewController/Views/StickyNoteView.swift StickyNoteView
ScreenSpace-Sample/ViewController/Delegates/ViewController+ARCoachingOverlayDelegate.swift Feature implementation
ScreenSpace-Sample/ViewController/Delegates/ViewController+UITextViewDelegate.swift Feature implementation
ScreenSpace-Sample/ViewController/Entities/StickyNoteEntity.swift StickyNoteEntity
ScreenSpace-Sample/ViewController/Views/MessageLabel.swift MessageLabel
ScreenSpace-Sample/ViewController/Gestures/ViewController+Gestures.swift Feature implementation