WWDC Quick Look 💓 By SwiftGGTeam
What's new in Quick Look for visionOS

What's new in Quick Look for visionOS

元の動画を見る

Highlight

visionOS の Quick Look に PreviewApplication API が追加され、数行のコードでウィンドウ化プレビューを開けます。3D モデルは Surface Mapping でデスクに自動吸着し、USDZ の variants メカニズムで 1 ファイル内の複数配色を切り替えられます。


主要内容

visionOS でファイルをプレビューする方法は 2 つ:インライン式(アプリを全画面 cover で覆う)とウィンドウ式(独立した volume で表示し、ユーザーがアプリを同時操作可能)。しかしウィンドウ式は以前ドラッグ&ドロップでのみトリガーでき、アプリはプレビュー過程をほぼ制御できませんでした——タイトル指定不可、編集オプションの無効化不可、ユーザーがプレビューを閉じたタイミングも不明。

今年 Apple は PreviewApplication API を発表。SwiftUI と Swift Concurrency 上に構築されています。PreviewApplication.open に URL を渡すとウィンドウ化プレビューを開き、URL 配列を渡すとコレクションビューを開き前後ナビゲーション矢印を表示。PreviewItem でタイトル(displayName)と編集モード(editingMode)をカスタマイズ可能——例えば .disabled でクロップ、トリムなどの編集ボタンを削除。API は session オブジェクトを返し、その events は Swift async stream でプレビューの開閉イベントを監視できます。

3D コンテンツ面では、最も要望の高かった 2 機能が実装されました。Surface Mapping で任意の 3D モデルがデスクや床に自動吸着——ウィンドウバーをデスクに近づけるとトリガー、吸着後は自由にスライドでき、ピッチ回転をロックしてモデルがデスクにめり込むのを防止。Configurations(USDZ では variants)で 1 ファイルに複数バリアントを含められます——異なる色の iPhone など、Quick Look 内で直接切り替え、配色ごとに別ファイルを用意する必要がありません。iOS と macOS でも利用可能。visionOS では FaceTime 通話中の設定切り替え同期にも対応。


詳細

PreviewApplication API

最も基本的な使い方:PreviewApplication.open に単一ファイルの URL を渡す(02:53)。

PreviewApplication.open(url: selectedURL)

URL 配列を渡すとコレクションビューを開く(03:48):

PreviewApplication.open(urls: allURLs, selectedURL: selectedURL)

キーポイント:

  • urls パラメータは配列を受け取り、Quick Look がコレクションビューとナビゲーション矢印を表示
  • selectedURL で初期フォーカスファイルを指定

PreviewItem でタイトルと編集モードをカスタマイズ(05:19):

let previewItem = PreviewItem(url: selectedURL, displayName: entryName, editingMode: .disabled)
PreviewApplication.open(previewItem: previewItem)

キーポイント:

  • displayName は Quick Look 上部メニューバーに表示
  • editingMode: .disabled で編集ボタンを削除し、元ファイルの誤変更を防止
  • その他の editingMode オプションは API ドキュメントを参照

session の events でプレビューライフサイクルを管理(06:47):

let session = PreviewApplication.open(url: selectedURL)
for await event in session.events {
    switch event {
    case .opened:
        isPreviewOpen = true
    case .closed:
        isPreviewOpen = false
    }
}

キーポイント:

  • session.events は Swift AsyncSequence——for await で反復
  • .opened.closed イベントで UI 上のプレビュー状態を同期
  • 同じファイルを再度開いても新しいウィンドウは作成されず、既存ウィンドウが前面に

USDZ Variants(Configurations)

USDZ で variantSet を使って設定バリアントを定義(12:22):

#usda 1.0
(
    defaultPrim = "iPhone"
)

def Xform "iPhone" (
    variants = {
        string Color = "Black_Titanium"
    }
    prepend variantSets = ["Color"]
)
{
    variantSet "Color" = {
        "Black_Titanium" { }
        "Blue_Titanium" { }
        "Natural_Titanium" { }
        "White_Titanium" { }
    }
}

キーポイント:

  • すべての variants は defaultPrim 上に定義する必要があり、Quick Look が正しくクエリ・表示できる
  • string Color = "Black_Titanium" でデフォルトバリアントを設定
  • prepend variantSets = ["Color"] でバリアントセット名を宣言
  • バリアント名にスペースは不可——アンダースコアを使用。Quick Look が表示時にスペースに変換
  • Quick Look 下部に設定ボタンが表示され、選択するとモデルが対応バリアントで再読み込み
  • バリアントに重いテクスチャや複雑なジオメトリを含めない——読み込み速度への影響を避ける

Surface Mapping

  • すべての 3D モデルで Surface Mapping が自動有効——追加コード不要
  • 水平面(デスク、床)をサポート
  • ウィンドウバーを面に近づけると吸着がトリガーされ、効果音が鳴る
  • 吸着後はピッチ回転をロックし、モデルが面にめり込むのを防止
  • USDZ エクスポート時、モデル底部が座標原点にあることを確認——吸着効果が正しく機能

重要ポイント

  1. インライン式 Quick Look の代わりに PreviewApplication.open を使用:ウィンドウ化プレビューはユーザーの現在操作を中断せず、マルチタスクに対応。コード量は SwiftUI の fullScreenCover + UIViewControllerRepresentable から 1 行呼び出しに削減。サムネイルの onTapGesturePreviewApplication.open(url:) を呼ぶ。

  2. variants を含む USDZ ファイルを作成:1 ファイルにすべての配色を含め、Quick Look 内で直接切り替え——ファイル数と管理コストを削減。visionOS の FaceTime では設定同期もサポート。USDZ の defaultPrim 上に variantSet を定義し、各バリアントが 1 設定に対応。バリアント名はスペースの代わりにアンダースコアを使用。

  3. 3D モデル底部を座標原点に合わせる:Quick Look の Surface Mapping はすべてのモデルでデフォルト有効——底部が原点にないと、デスク吸着後に浮いたりめり込んだりする。3D モデリングソフトでエクスポート前にモデル全体を下げ、底面が Y=0 平面に来るようにする。

  4. session.events で UI 上にプレビュー中のファイルを表示:複数プレビューを開くとユーザーはどれを見ているか忘れがち——目のアイコンなどの視覚マーカーで状態を明確に。PreviewApplication.open が返す session を保持し、for await event in session.events で状態変数を更新して UI をリフレッシュ。


関連セッション

コメント

GitHub Issues · utterances