View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • SwiftUIの新機能

    各Appleプラットフォーム向けの優れたアプリの構築を支援するSwiftUIの最新機能を紹介します。Liquid Glassでアプリの見た目と雰囲気を刷新する方法や、フレームワークの機能強化や新しいInstrumentsによってパフォーマンスを強化する方法、Webコンテンツとリッチテキストの編集などの高度な機能を組み込む方法も解説します。また、ビューの3Dレイアウトなど、さまざまな領域に拡張しているSwiftUIの利用方法についても学べます。

    関連する章

    • 0:00 - Introduction
    • 1:22 - Make the new design shine
    • 6:59 - Framework foundations
    • 14:33 - SwiftUI across the system
    • 20:04 - Expand SwiftUI views
    • 25:01 - Next steps

    リソース

    • Adopting Liquid Glass
    • Applying Liquid Glass to custom views
    • dragContainer(for:in:selection:_:)
    • draggable(containerItemID:)
    • Human Interface Guidelines
    • Populating SwiftUI menus with adaptive controls
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • アシスティブアクセスのためのアプリのカスタマイズ
    • イマーシブなアプリを作成するためのMetalレンダリングの新機能
    • ウィジェットの新機能
    • 新しいデザインによるSwiftUIアプリの作成
    • Code Along:SwiftUIのAttributedStringを使って優れたテキスト体験を実現
    • Code Along:Xcodeによるローカライズの詳細
    • InstrumentsによるSwiftUIのパフォーマンス最適化
    • iPadアプリのデザインの向上
    • Swift Chartsの3次元変換
    • Swiftの並行処理の活用
    • SwiftUIとRealityKitの連係
    • SwiftUIによるvisionOSのシーンの設定
    • SwiftUIの並行処理の詳細
    • SwiftUIの空間レイアウトの紹介
    • SwiftUI向けWebKitの紹介
    • visionOS 26の新機能
  • このビデオを検索

    こんにちは Annaです Peterです 2人ともSwiftUIチームのエンジニアです 今日はSwiftUIの新機能について お話しできるのがとても楽しみです 低レベルのパフォーマンス改善から ユーザーインターフェイスの ボタンに至るまで システム全体にわたっていくつかの 大きな改善が行われました テキストやWebベースのコンテンツの 扱いが容易になり SwiftUIはますます広がりを見せています 私とAnnaがSwiftUIの次に 楽しんでいるのが ハイキング中に写真を撮ることです Peterと私は 旅行の計画と共有に役立つ アプリを開発しました このアプリはSwiftUIの新機能を フルに活用して 見た目と操作感を高めています まず 数々の新しいシステム機能と それらをどのように アプリに活かしたかをご紹介します それからパフォーマンス、アニメーション、 レイアウトの改善点も説明します PeterはAppleの プラットフォーム全体のどんな部分で 新しくSwiftUIが 使えるようになったかを説明します 最後に Webコンテンツや リッチテキストのサポートを含む SwiftUIビューの拡張された 機能について紹介します では初めに 新しいデザインでアプリに 輝きを添える方法をご紹介します 新しいデザインシステムは Appleのプラットフォーム全体で一貫した 明るくスムーズな体験を可能にします

    Peterと私が再コンパイルした結果 アプリの外観は完全に刷新されました アプリの構造は変わっていませんが ナビゲーションコンテナは 新しいデザイン向けに一新されました

    iPadとmacOSでは アプリのサイドバーが ガラスのような見た目になり 周囲のコンテンツを映し出しています また タブバーもアップデートされ iPhoneではタブバーが新しく よりコンパクトな外観になりました

    タブバー以外にも 大半のツールバー項目が Liquid Glassで表示されるようになりました これらの項目は ナビゲーション動作時には モーフィングもできます ぜひ試してください

    アプリでは 新しいToolbarSpacer APIで ツールバー項目のセクションが調整されます また 固定スペーサを使用して 上下の矢印ボタンと 設定ボタンを分離しています

    ツールバー項目を際立たせるため その部分のLiquid Glassは色付けが可能です

    私達はこの効果を得るため 目立つ境界線の付いた色付きの ボタンスタイルを採用しています アプリの中でスクロールダウンすると スクロールされている端の ツールバーのコンテンツに ぼかし効果が適用されます このスクロールエッジエフェクトによって バーの下に何があっても バーのコンテンツは常に見やすくなります

    次の旅行を計画する時は 大抵いろいろと検索するものです 検索バーは今回iPhone画面の下部に配置され より人間工学的なレイアウトになりました 既存のコードでは searchableモディファイアが NavigationSplitViewの 外側に置かれています 画面下端の検索バーを実装するために コードの変更は必要ありませんでした

    この同じ配置がiPadにも適用され アプリでは新しく検索バーが 上部の末端に表示されるようになりました

    searchableを使用すると かつてなく速く 探しものを見つけることができます 検索が目的である タブベースのアプリの場合は 検索タブが タブバー内の他のタブとは 別に表示され 検索フィールドに モーフィングするようになりました タブに検索ロールを設定すれば 新しい見た目で表示されます また他にも システム全体の コントロールが新しくなりました 例えば トグル、セグメントピッカー、 スライダなどです カスタムビューも例外ではなく APIを使えば同様に 新しいデザインを活用できます カスタムビューにもガラス効果を 適用することで 従来の写真のように周囲のコンテンツが 美しく反映されるようになりました これらのアップデートは 新しいデザインでできることの ごく一部にすぎません 新しいデザインを活用する方法の 詳細については 採用のベストプラクティスから 高度なカスタマイズの方法まで 「Build a SwiftUI app with the new design」でご紹介しています iPadOS 26でも ユーザーがアプリを操作する方法に関して いくつかのすばらしい 改善が行われました アプリで下にスワイプすると メニューバーが表示されるため 一般的なアクションに より簡単にアクセスできます

    macOSでメニューバーを作成するために 使用されていたコマンドAPIは iPadでも同じ結果を 生成するようになりました 私達のアプリでは次の旅行についての メモを残すことができるので テキスト編集のコマンドを少し追加しました 旅行の計画を立てるときはよく 複数のアプリを同時に見ることがあります iPadでのウインドウ操作は さらに柔軟になり アプリのサイズも スムーズに変更できるようになりました

    このようにSplit Viewを 使用するアプリでは 使用可能なスペースに基づいて自動的に 列の表示と非表示が切り替えられます アプリのサイズ変更を可能にするため UIRequiresFullscreenなどの 画面を フルサイズに固定するAPIから移行します このプロパティリストキーは iPadOS 26では非推奨になっています iPadアプリで サイズ変更可能なウインドウや 新しいメニューバーを 設計する方法については 「Elevate the design of your iPad app」を ご覧ください macOSでのウインドウのサイズ変更も よりスムーズになりました コンテンツの表示サイズの変更による ウインドウのサイズ変更の場合は そのコンテンツとウインドウの アニメーションがSwiftUIで同期されます このアプリでは新しいウインドウの サイズ変更アンカーを採用して アニメーションの始点を 調整しています

    これはコンテンツの様々な部分の 連係を保つのに便利です 例えば設定画面のタブを 切り替える際などです またSwiftUIの構成要素が 改善されたことも アプリの改善につながっています パフォーマンスの大幅な向上や 使いやすさの改善 コンテンツの新しいレイアウト方法などを 活用すれば 今年はSwiftUIですばらしいアプリを 構築できるでしょう フレームワークのパフォーマンスの向上は Appleプラットフォーム全体の すべてのアプリにメリットをもたらします いくつもの重要分野で 大きな改善が行われています 例えばリスト、スクロール、 プロファイリングなどです 私が特に気に入っているのは macOSのリストの改善です macOSでは 10万項目を超えるリストの 読み込みが6倍高速化しました そしてこうしたリストの更新は 最大16倍速くなりました 大型のリストほど パフォーマンスが大きく向上しており すべてのプラットフォームで 改善が見られています

    それによって この旅行計画アプリを 利用する際のエクスペリエンスも向上し 旅行の確認、絞り込み、更新など 様々な操作に役立っています スクロール機能も大幅に向上しました

    アプリでスクロール操作を行うと SwiftUIには次のフレームをレンダリング するための一定の時間が与えられます その期限までにすべての処理が 終わらない場合は コマ落ちが発生します これは望ましくないことで アプリが不具合や遅さを 感じさせる原因になります 今回SwiftUIでは iOSとmacOSにおける ユーザーインターフェイスの更新の スケジュール設定が改善されました そのため応答性が高まり SwiftUIがより多くの作業をこなして 次のフレームに備えられるようになります 全体として 高いフレームレートで 素早くスクロールを行う際に アプリがコマ落ちを起こす 可能性が低くなります この図のLazyVStackのように スクロールビューの中に 遅延スタックを配置すると SwiftUIは各ビューが現れる直前まで そのビューのロードを遅らせますが 遅延スタックを含むスクロールビューも 同じ動作をするようになりました これはフォトカルーセルのようなビューを 作成するのに大変便利です アプリにどんなパフォーマンスの問題が 残っているかを把握するため 新しいSwiftUIのパフォーマンス強化機能を Xcodeで使ってみたいと思います ここにはいくつものレーンがあり 様々なパフォーマンス関連の問題を 簡単に確認することができます 長いビュー本体の更新や プラットフォームビューの更新などです このアプリをできるだけ速く動作させるには もう少ししなければならないことが あるようです

    この新しい強化機能の詳細については 「Optimize SwiftUI performance with instruments」をご覧ください

    アプリ開発に不可欠なもう1つの要素が 並行プログラミングです Swiftでは構造化並行処理が サポートされているため コンパイル時にデータ競合を 安全に検証できます そのおかげで私とPeterは 並行コードのバグを 問題が起こる前に発見できました 構造化された並行処理を アプリに導入する方法については 「Embracing Swift Concurrency」を ご覧ください またその後に「Explore concurrency in SwiftUI」も視聴すれば SwiftUIでSwiftの並行処理が どう活用されているかがわかります

    アプリが並行処理で データをロードしている間は アニメーションを表示することにしました この図のアニメーション化には Animatableプロトコルを使い カスタムのAnimatableDataプロパティを 定義して 描画方向以外のすべての形状プロパティを アニメーション化しています

    このAnimatableData宣言の 全文を追加した後に 単に描画方向を除外するとなると かなりのコード量になります 新しいAnimatableマクロを使うと カスタムのAnimatableDataプロパティを 削除すれば 後はSwiftUIが自動的に コードを合成してくれます また AnimatableIgnoredマクロを使って 描画方向など アニメーション化しない プロパティを除外します レイアウトも新しい次元に入りました 厳密には3次元です

    SwiftUIにはご存じの通り 新しい一連の 奥行きベースのモディファイアがあるため SwiftUIで直接 より立体的なレイアウトを作成できます visionOSでは このアプリで ハイキングのルートを計画できます ここに その時間に自分が ハイキングする場所に基づいて 空に太陽を表示する 機能を追加したいと思います 通常の2D配置のかわりに 新しいAlignment3D型を使って 太陽の位置を決めています SpatialOverlayモディファイアを使って 太陽を配置し オーバーレイの配置は 時間に基づいて調整します

    いいですね これでもう日焼けの心配はありません これはvisionOS 26の空間レイアウトの 機能強化を利用すれば どんなことができるかの一例にすぎません ぜひ「Meet SwiftUI spatial layout」を 視聴して 空間体験を生み出す新しいツールの 詳細をご覧ください 私とPeterはいつも リュックサックが一杯になりすぎるので 荷造りの計画に役立つボリュームを アプリに追加しました 新しいManipulableモディファイアは ユーザーのオブジェクト操作を可能にします ここでは水筒のモデルを使って ユーザーがそれを持ち上げ 動かせるようにしてみます

    荷物にあと何を入れればよいか わかりやすくするため 新しいシーン取得APIを使用して その情報を環境から 読み取るようにします

    それに基づいて各アイテムに台座を追加し それをテーブルに固定します

    新しいボリュメトリックAPIを使えば 本当にすばらしい体験を 生み出すことができます いいですね

    SwiftUIでは他にも visionOSの ウインドウ、ボリューム、シーンについて ウインドウ復元から 新しいシーンタイプまで様々な 新機能が生まれています それらの使用方法については 「Set the scene with SwiftUI in visionOS」でご確認ください 「What’s new in visionOS」では様々な 新機能を詳しくご紹介しています 絵のようにすばらしい 新機能が盛りだくさんですね これなら次の写真撮影ハイキングの準備は 簡単に進みそうです そうね この間の旅行で撮った この写真を見てください

    本当のサファリ体験でしたよ すごくいいね Anna ファインダーを広げるいいチャンスです ちょうど今年のSwiftUIのように アプリはシステム全体で SwiftUIを活用することができます シーンの強化機能のほか ウィジェットや コントロールの新しいAPIを使えば アプリがこれまでになく プラットフォームの一部になります そしてSwiftUIはこれまで以上に 他のフレームワークと連係します シーンはアプリの様々なビューの ルートコンテナで インターフェイスの個々の部分を 表します シーンにアクセスするには アプリ本体の中でシーンを宣言します 例えばWindowGroupです 今年はUIKitやAppKitの ライフサイクルアプリからも シーンブリッジングを使って SwiftUIの シーンをリクエストできます シーンブリッジングは実に強力です UIKitとAppKitのライフサイクルアプリが SwiftUIのシーンと 相互運用可能になります アプリでこれを利用することで SwiftUI限定のシーンタイプを開いたり SwiftUI限定の機能を UIKitかAppKitの コードから直接使用できるようになります MenuBarExtraやImmersiveSpaceなどの シーンタイプを利用できます windowStyleや immersiveEnvironmentBehaviorなどの シーンモディファイアも使えます シーンブリッジングは 今年登場した SwiftUIの新しいシーンタイプで機能します RemoteImmersiveSpaceと同様に macOS TahoeとvisionOS 26のMacアプリは Apple Vision Proで新しいシーンを使って ステレオコンテンツをレンダリングできます

    RemoteImmersiveSpaceは Apple Vision Proでステレオコンテンツを レンダリングするためのmacOSシーンです RemoteImmersiveSpaceでは CompositorServicesでレンダリングします Macアプリでは ホバーエフェクトや 入力イベントを使用できます CompositorServicesとMetalの詳細や RemoteImmersiveSpaceの使用方法の 詳細は「What’s new in Metal rendering for immersive apps」をご覧ください AssistiveAccessは 認知障がいのあるユーザーのための 特別なモードです ユーザーがiPhoneをこのモードに設定 している場合 新しいAssistiveAccessの シーンタイプを導入することで アプリでUIを表示することもできます このAPIの詳細と iOS 26のアプリをアシスティブアクセス 対応にする方法の詳細については 「Customize your app for Assistive Access」をご覧ください SwiftUIでは今年 AppKitの使用に関する いくつかの大きな機能強化があります シーンブリッジングに加えて SwiftUIビューを含むシートを表示できます これは SwiftUIをアプリに 段階的に導入するための優れた方法です NSGestureRecognizerRepresentableを 使用して AppKitのジェスチャを SwiftUIにブリッジできます また Interface Builderで NSHostingViewを使用できます 今年 SwiftUIでは RealityKitと連係して機能する より多くのAPIが提供され 機能強化も多数あります これらの機能強化により SwiftUIコードによるRealityKitとの あらゆるインタラクションが簡素化されます RealityKitエンティティが Observableに 準拠するようになり SwiftUIビューの 変更を簡単に監視できます Coordinate Conversion APIが 機能強化されたほか RealityKitからの プレゼンテーションの 直接サポートも強化されています 新しいコンポーネントを使うと RealityKitのエンティティから直接 ご覧のようなSwiftUIの ポップオーバーを表示できます 次の写真ハイキングで行きたい場所を 正確にマークするのに最適です SwiftUIとRealityKitの統合は ほかにも数多くあります アタッチメントコンポーネント、 アニメーションの同期、 コンポーネントへのバインド、新しい RealityViewのサイズ関連の動作などです SwiftUIのRealityKitの連係の 継続的な発展については 「Better Together: SwiftUI & RealityKit」をご覧ください 私はコントロールセンターの コントロールが大好きです 自分のスマホで頻繁に使いますが 自宅内のコントロールや ショートカットでのデバイス操作 カメラ体験の制御など 用途は多彩です 今年 watchOS 26とmacOS Tahoeに カスタムコントロールが搭載されます Annaと私は これらのプラットフォームで コントロールを使えるのが楽しみです Macでは コントロールセンターから直接 カスタムコントロールにアクセスできます Watchでは 散歩に出かけた時などに お気に入りの写真スポットを タップ1つでマークできます 最高ですね 私はウィジェットも大好きです アプリから一目で 情報を得られるのが気に入っています 今年 ウィジェットが visionOSとCarPlayに導入されます visionOSでは 共有スペース内の ウィジェットの外観を カスタマイズできます アプリにカウントダウンウィジェットを加え 新しいlevelOfDetail環境値を 使用しました

    ウィジェットに近付くと拡張して 前回訪れた時に撮った写真が 表示されます 次の写真ハイキングがいつか リマインドする素晴らしい方法です ついにあと7日ですね! ウィジェットの今年の更新はまだあります CarPlayでのライブアクティビティや プッシュベースの更新のAPI watchOSでの関連性の新しいAPIなどです 詳細については 「What’s new in widgets」をご覧ください SwiftUIでは今年 ビューの機能が拡張されました リッチテキストの編集や 3Dでのグラフ作成など 優れた新しいビューと SwiftUIの既存のビューの 機能強化があります Webコンテンツを アプリに直接埋め込めるよう WebKitにSwiftUI APIの 包括的なセットが追加されました その1つがWebViewです WebViewは アプリにWebコンテンツを 表示するための新しいSwiftUIビューです Safariと同様にWebKitを利用しており WebViewを初期化することで アプリにURLを表示できます Webページをカスタマイズし操作するために WebViewでは Swift向けに 一から設計された 新しい監視可能な モデルタイプであるWebPageも表示できます WebPageは充実した Webとのインタラクション機能を備えています プログラムによるページナビゲーションと ページプロパティへのアクセスができます

    WebKitの新しいSwiftUIサポートは 他にもあります ユーザーエージェントのカスタマイズ、 JavaScriptの呼び出し、 カスタムのURLスキームなどです これらの新しいWebKit APIについて 詳しくは 「Meet WebKit for SwiftUI」をご覧ください ハイキングがそれほどきつくないことを 家族に納得させるのは大変ですが Swift Chartsに 新しく3Dサポートが加わったおかげで 説得が楽になりそうです 3Dチャートの表示ではChart3Dを宣言します Chart3Dはプロットを3次元で表示します 新しいZ固有のモディファイアを使うと 3D空間でスケールを指定できます 前回のハイキングでくしゃみが多かった 理由がわかりました 山道が正弦曲線だったんです 3Dチャートをアプリに追加する方法の 詳細については 「Bring Swift Charts to the third dimension」をご覧ください 経路のデータを他のアプリと 共有しやすくなるよう Annaと私はMacアプリに ドラッグ&ドロップを導入しました アプリで利用できるドラッグ&ドロップは 今年 いくつかの点で大幅に強化されます draggableモディファイアの 新しいバリエーションと 新しいdragContainerモディファイアを使うと 複数の項目をドラッグできます これによりビューを ドラッグ項目のコンテナにできます 選択に基づいて 項目を転送へ戻します

    これは アプリのカスタム選択動作で 機能します このモディファイアを使うと SwiftUIはドロップが発生した時に 項目のドラッグを遅延させて要求します

    新しいDragConfiguration APIを使うと アプリでサポートされるドラッグ操作を カスタマイズできます ここでは削除を許可しています イベントの監視に使用するのは 新しい OnDragSessionUpdatedモディファイアです 写真を削除する前に phaseが .ended(.delete)であることを確認します

    これで Dockのゴミ箱にドラッグすると 写真が削除されるようになりました

    ドラッグ中のプレビューの外観を カスタマイズするには フォーメーションを指定します

    スタックのフォーメーションは 項目を互いにうまく重ねて配置します 成功です Annaと私は旅行を計画して 共有するだけでなく 友人にフォローして 参加してもらいたいと思っています 友人が私たちの写真にコメントできるよう アプリを開発してきました SwiftUIに追加された リッチテキスト編集のサポートは このような目的に最適です

    TextViewにAttributedStringの サポートが追加されました AttributedStringへのバインディングを TextEditorに渡すことで 組み込みの テキスト書式設定コントロールを使用して 友人たちがリッチテキストで 写真にコメントできるようにしました 素晴らしいですね

    なんだ この香りは SwiftUIのおいしい リッチテキストの香りのようです 今年 リッチテキストとローカリゼーションの オプションを使った料理があるそうです 「Cook up a rich text experience in SwiftUI with AttributedString」で 詳細をご覧ください 段落スタイルのカスタマイズ、 属性の変換、 アプリでユーザーに使用を許可する 属性の制限もできます デザートには「Explore localization with Xcode」をどうぞ あらゆる言語で優れた体験を創出する 方法を学べます SwiftUIを 様々な新しい領域で 使用できるのがとても楽しみです 他にもいろいろな架け橋があります 前回のハイキングの写真を見てよ

    次はここに行くべきですね さて 新しいアプリを使って もっと写真を撮りに行く時です ご自身のアプリで 新しいデザインと刷新された 外観と雰囲気をチェックし 新しいAPIでアプリを強化しましょう 新しいパフォーマンスInstrumentsで アプリのパフォーマンスを検査しましょう ボリューム関連の追加機能と 新しい空間レイアウトで アプリに新たな深みを生み出しましょう リッチテキストとWebKitの機能強化を 導入して アプリ体験をより豊かにしましょう そして これまで以上に多くの場所で コントロールとウィジェットを活用しましょう SwiftUIによる 今年の新たな冒険を ぜひお楽しみください ご紹介したパフォーマンスの強化が 次のハイキングでも きつい山行を楽にしてくれるでしょう さあ 出発準備はOK? もちろんです

    • 2:27 - Toolbar spacer

      import SwiftUI
      
      struct TripDetailView: View {
          var body: some View {
              NavigationStack {
                  TripList()
                      .toolbar {
                          ToolbarItemGroup(placement: .primaryAction) {
                              UpButton()
                              DownButton()
                          }
      
                          ToolbarSpacer(.fixed, placement: .primaryAction)
      
                          ToolbarItem(placement: .primaryAction) {
                              SettingsButton()
                          }
                      }
              }
          }
      }
      
      struct TripList: View {
          var body: some View {
              Text("TripList")
          }
      }
      
      struct UpButton: View {
          var body: some View {
              Button("Up", systemImage: "chevron.up") { }
          }
      }
      
      struct DownButton: View {
          var body: some View {
              Button("Down", systemImage: "chevron.down") { }
          }
      }
      
      struct SettingsButton: View {
          var body: some View {
              Button("List Settings", systemImage: "ellipsis") { }
          }
      }
    • 2:52 - Toolbar item tint

      import SwiftUI
      
      struct InspectorView: View {
          var body: some View {
              NavigationStack {
                  InspectorMap()
                      .toolbar {
                          ToolbarItem(placement: .primaryAction) {
                              SaveLocationButton()
                                  .buttonStyle(.borderedProminent)
                                  .tint(.pink)
                          }
                      }
              }
          }
      }
      
      struct InspectorMap: View {
          var body: some View {
              Text("InspectorMap")
          }
      }
      
      struct SaveLocationButton: View {
          var body: some View {
              Button("SaveLocationButton") { }
          }
      }
    • 3:30 - Searchable

      import SwiftUI
      
      struct PlannerSplitView: View {
          @State private var query: String = ""
      
          var body: some View {
              NavigationSplitView {
                  Text("Sidebar")
              } detail: {
                  Text("Detail")
              }
              .searchable(
                  text: $query,
                  prompt: "What are you looking for?"
              )
          }
      }
    • 4:12 - Search tab

      import SwiftUI
      
      struct HealthTabView: View {
          @State private var text: String = ""
          
          var body: some View {
              TabView {
                  Tab("Summary", systemImage: "heart") {
                      NavigationStack {
                          Text("Summary")
                      }
                  }
                  Tab("Sharing", systemImage: "person.2") {
                      NavigationStack {
                          Text("Sharing")
                      }
                  }
                  Tab(role: .search) {
                      NavigationStack {
                          Text("Search")
                      }
                  }
              }
              .searchable(text: $text)
          }
      }
    • 4:37 - Glass effect

      import SwiftUI
      
      struct ToTopButton: View {
          var body: some View {
              Button("To Top", systemImage: "chevron.up") {
                  scrollToTop()
              }
              .padding()
              .glassEffect()
          }
      
          func scrollToTop() {
              // Scroll to top of view
          }
      }
    • 5:20 - Menu bar commands

      import SwiftUI
      
      @main
      struct TravelPhotographyApp: App {
          var body: some Scene {
              WindowGroup {
                  RootView()
              }
              .commands {
                  TextEditingCommands()
              }
          }
      }
      
      struct RootView: View {
          var body: some View {
              Text("RootView")
          }
      }
    • 6:40 - Window resize anchor

      import SwiftUI
      
      struct SettingsTabView: View {
          @State private var selection: SectionTab = .general
          var body: some View {
              TabView(selection: $selection.animation()) {
                  Tab("General", systemImage: "gear", value: .general) {
                      Text("General")
                  }
                  Tab("Sections", systemImage: "list.bullet", value: .sections) {
                      Text("Sections")
                  }
              }
              .windowResizeAnchor(.top)
          }
      }
      
      enum SectionTab: Hashable {
          case general
          case sections
      }
    • 11:24 - @Animatable macro

      import SwiftUI
      
      @Animatable
      struct LoadingArc: Shape {
          var center: CGPoint
          var radius: CGFloat
          var startAngle: Angle
          var endAngle: Angle
          @AnimatableIgnored var drawPathClockwise: Bool
      
          func path(in rect: CGRect) -> Path {
              // Creates a `Path` arc using properties
              return Path()
          }
      }
    • 12:15 - Spatial overlay

      import RealityKit
      import SwiftUI
      
      struct Map: View {
          @Binding var timeAlignment: Alignment3D
      
          var body: some View {
              Model3D(named: "Map")
                  .spatialOverlay(
                      alignment: timeAlignment
                  ) {
                      Sun()
                  }
          }
      }
      
      struct Sun: View {
          var body: some View {
              Model3D(named: "Sun")
          }
      }
    • 13:04 - Manipulable and surface snapping

      import ARKit
      import RealityKit
      import SwiftUI
      
      struct BackpackWaterBottle: View {
          @Environment(\.surfaceSnappingInfo) var snappingInfo: SurfaceSnappingInfo
      
          var body: some View {
              VStackLayout().depthAlignment(.center) {
                  waterBottleView
                      .manipulable()
      
                  Pedestal()
                      .opacity(
                          snappingInfo.classification == .table ? 1.0 : 0.0)
              }
          }
      
          var waterBottleView: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct WaterBottleView: View {
          var body: some View {
              Model3D(named: "waterBottle")
          }
      }
      
      struct Pedestal: View {
          var body: some View {
              Model3D(named: "pedestal")
          }
      }
    • 15:00 - SwiftUI scenes

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
          var body: some Scene {
              WindowGroup(id: "AppContents") {
                  PhotoWalkContent()
              }
          }
      }
      
      struct PhotoWalkContent: View {
          var body: some View {
              Text("PhotoWalkContent")
          }
      }
    • 16:28 - Assistive Access scene

      import SwiftUI
      
      @main
      struct PhotoWalk: App {
        var body: some Scene {
          WindowGroup {
            ContentView()
          }
      
          AssistiveAccess {
            AssistiveAccessContentView()
          }
        }
      }
      
      struct ContentView: View {
        var body: some View {
          Text("ContentView")
        }
      }
      
      struct AssistiveAccessContentView: View {
        var body: some View {
          Text("AssistiveAccessContentView")
        }
      }
    • 17:52 - SwiftUI presentations from RealityKit

      import RealityKit
      import SwiftUI
      
      struct PopoverComponentView: View {
          @State private var popoverPresented: Bool = false
          var body: some View {
              RealityView { c in
                  let mapEntity = Entity()
      
                  let popover = Entity()
                  mapEntity.addChild(popover)
                  popover.components[PresentationComponent.self] = PresentationComponent(
                      isPresented: $popoverPresented,
                      configuration: .popover(arrowEdge: .bottom),
                      content: DetailsView()
                  )
              }
          }
      }
      
      struct DetailsView: View {
          var body: some View {
              Text("DetailsView")
          }
      }
    • 19:24 - Level of detail

      import SwiftUI
      import WidgetKit
      
      struct PhotoCountdownView: View {
          @Environment(\.levelOfDetail) var levelOfDetail: LevelOfDetail
          var body: some View {
              switch levelOfDetail {
              case .default:
                  RecentPhotosView()
              case .simplified:
                  CountdownView()
              default:
                  Text("Unknown level of detail")
              }
          }
      }
      
      struct RecentPhotosView: View {
          var body: some View {
              Text("RecentPhotosView")
          }
      }
      
      struct CountdownView: View {
          var body: some View {
              Text("CountdownView")
          }
      }
    • 20:28 - WebView

      import SwiftUI
      import WebKit
      
      struct HikeGuideWebView: View {
          var body: some View {
              WebView(url: sunshineMountainURL)
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 20:44 - WebView with WebPage

      import SwiftUI
      import WebKit
      
      struct InAppBrowser: View {
          @State private var page = WebPage()
      
          var body: some View {
              WebView(page)
                  .ignoresSafeArea()
                  .onAppear {
                      page.load(URLRequest(url: sunshineMountainURL))
                  }
          }
      
          var sunshineMountainURL: URL {
              URL(string: "sunshineMountainURL")!
          }
      }
    • 21:35 - 3D charts

      import Charts
      import SwiftUI
      
      struct HikePlotView: View {
          var body: some View {
              Chart3D {
                  SurfacePlot(
                      x: "x", y: "y", z: "z") { x, y in
                          sin(x) * cos(y)
                      }
                      .foregroundStyle(Gradient(colors: [.orange, .pink]))
              }
              .chartXScale(domain: -3 ... 3)
              .chartYScale(domain: -3 ... 3)
              .chartZScale(domain: -3 ... 3)
          }
      }
    • 22:18 - macOS drag and drop

      import SwiftUI
      
      struct DragDropExample: View {
          @State private var selectedPhotos: [Photo.ID] = []
          var body: some View {
              ScrollView {
                  LazyVGrid(columns: gridColumns) {
                      ForEach(model.photos) { photo in
                          view(photo: photo)
                              .draggable(containerItemID: photo.id)
                      }
                  }
              }
              .dragContainer(for: Photo.self, selection: selectedPhotos) { draggedIDs in
                  photos(ids: draggedIDs)
              }
              .dragConfiguration(DragConfiguration(allowMove: false, allowDelete: true))
                  .onDragSessionUpdated { session in
                      let ids = session.draggedItemIDs(for: Photo.ID.self)
                          if session.phase == .ended(.delete) {
                              trash(ids)
                              deletePhotos(ids)
                          }
                  }
              .dragPreviewsFormation(.stack)
          }
      }
    • 23:55 - Rich text view

      import SwiftUI
      
      struct CommentEditor: View {
          @Binding var commentText: AttributedString
      
          var body: some View {
              TextEditor(text: $commentText)
          }
      }

Developer Footer

  • ビデオ
  • WWDC25
  • SwiftUIの新機能
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン