ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
watchOS 10に向けたアプリのアップデート
watchOS 10の最新機能を活用するために、Apple Watchアプリをアップデートする過程を紹介します。最新のSwiftUI APIを使って、情報を最大限に見やすくしたり、Digital Crownを中心にアプリのナビゲーションを整えるためのCode-Alongを一緒に進めていきましょう。
関連する章
- 1:33 - Build against the watchOS 10 SDK
- 2:33 - NavigationSplitView
- 5:21 - TabView and vertical pagination
- 8:11 - Toolbar with new placement options
- 9:07 - Background color
- 11:10 - Materials
リソース
関連ビデオ
WWDC23
-
ダウンロード
♪ ♪
Nina:こんにちは Nina Paripovicです watchOSソフトウェアエンジニアです このCode-Alongセッションでは watchOS 9 SDKでビルドしたアプリを watchOS 10用にアップデートします システム全体の再設計と並行して アプリを美しく見せるために 使える新しいデザインの枠組みと SwiftUI APIについて話します サンプルプロジェクトは このセッションの 関連リソース一覧にリンクされています 今すぐダウンロードして 一緒にwatchOS 10でビルドしましょう 始める前に 既存のプロジェクトを見てみましょう 今回はBackyard Birdsを アップデートします 美しい裏庭を作成・管理し 好奇心旺盛な 鳥たちを迎え入れるアプリです アプリには裏庭の一覧があります 各裏庭の詳細を表示することで 活動状況や状態が分かります エサや水が不足していれば 補充出来ます 各裏庭にいる すべての 鳥たちを見ることができます watchOS 10は Watchアプリに 楽しくフレッシュな見た目をもたらします まだ確認されていない方は 「watchOS 10について」と 「watchOS 10に向けたアプリの デザインおよび構築方法」で このセッションで使用する デザインの基本についてご覧ください では Xcodeを開いて アプリのアップデートを始めましょう
これが 現在watchOS 9で動作している Backyard Birdsアプリです 裏庭のリストが表示され 詳細に移動できます まず watchOS 10 SDKで ビルドしてみましょう
アプリはすでに最高の仕上がりです スクロールすると変化する 大きなタイトルや ナビゲーションバーの 下にあるコンテンツをぼかす 新しいマテリアルなど新しいシステム機能が 搭載されています 裏庭をタップするとセルが アニメーション表示され 左上のシステムツールバーボタンの スタイルが自動的に適用されます スクロールして Refillをタップすると 新たにぼかしの入った 背景マテリアルが表示されます
Backyard Birdsの利用者が 最も関心を寄せるのは 自分の裏庭の状況です 現在は アプリを起動すると最初に リストから裏庭をタップし 詳細表示で何が起きているかを 確認しています watchOS 10では NavigationSplitViewを使って アプリの構造を変更することで より簡単に確認できるようになります これで 自分の裏庭の詳細表示に 直接アクセスできるようになり 友人の庭を訪問したい時は 一覧に戻ることができるようになります 詳細ビューがアプリで 最も重要な部分であるため NavigationSplitViewを実装することで 強調することができます
NavigationSplitViewは このようにソース一覧と詳細の 結びつきが強い場合に最適です 起動時に直接詳細を表示することで 集中できる一方 ソース一覧から 他の庭に切り替えることも簡単です
iOSとiPadOSのBackyard Birdsでは すでに使用しています NavigationSplitViewは 私たちのアプリにぴったりです
ContentViewでNavigationStackを NavigationSplitViewに入れ替えます 次に navigationDestinationの内容を NavigationSplitViewに移動します 最後に watchOS 10で利用可能な 新しいリスト選択APIを使用して NavigationSplitViewで 表示する詳細ビューの管理を行います まず NavigationStackを NavigationSplitViewに置き換えます
NavigationSplitViewのルートにある Backyard Listはそのままにします navigationDestination モディファイアを削除し BackyardViewを 詳細ビュービルダーに移動します selectedBackyardはオプショナルのため 必ずアンラップして フォールバックビューを用意します
最後に selectionバインドを受け取る リストイニシャライザを使います リストのselectionパラメータに 値を指定すると selectionバインドによって NavigationSplitView内で どの詳細ビューを表示するかが決まります
良いですね デフォルトで 選択した庭の 詳細ビューが表示されるようになりました 起動時に詳細を表示するので navigationTitleを削除します ソース一覧ボタンを使って 残りの裏庭を見ることができます 詳細ビューに戻ると 美しいフルスクリーン アニメーションが表示されます 現在 backyardビューは スクロール可能な 長いリストになっています リストはすでに3つの 異なるセクションに分かれており それぞれ異なる機能を備えています Todayビュー Habitatビュー Visitorsビューです 代わりにTabViewを使い 各セクションに タブを作成することで アプリの 視覚的な分かりやすさを向上できます
TabViewが コンテンツを フルスクリーンビューに分割し 各タブに明確な目的を 持たせることができます Digital Crownの機能は維持して ビューの素早いスクロールを可能にします 新しい縦型ベージスタイルでは TabViewを使ってこれを実現できます タブ間を素早く移動したり 1つのタブ内でスクロールもできます
Xcodeに戻って TabViewを 詳細ビューで使うように更新します
BackyardViewでは 各セクションを それぞれのビューに移動し ListをTabViewに置き換えます TabViewの各ページは スクリーン全体を占めるので SectionとDividerは必要ありません セクションヘッダを navigationTitlesとして追加します
最後に tabViewStyleモディファイアを使って verticalPageを指定します あと少しです ページをめくると ビューが各タブに収まっています 全ての鳥を簡単に表示するために VisitorViewをリスト化できます
TabViewが子リストビューに 1つのタブを指定しています リスト画面の高さを超える場合 ビューはスクロール可能になります
縦長のTabView内に スクロール可能なコンテンツがある場合 可能な限り最後のタブに配置しましょう
また エサと水のレベルを 簡単に区別できるように Habitatビューを2つのタブに分けます
そこで TabViewに収まる 独自のゲージを作りました
TabViewの中に エサと水のインスタンスを作成し HabitatViewを 新しいGaugeViewに置き換えます
いい感じです 後は補充機能を追加するだけです そこでツールバーを使います watchOS 10では ツールバーの 配置オプションが一新され すべての画面サイズに対応可能になりました 新しいボトムバーの配置は コントロールのために最適な場所です この配置オプションを利用して ボトムバーにRefillボタンを追加します
HabitatGaugeViewに戻り ツールバーを追加し ToolbarGroupを使って ボトムバーの位置を指定します Spacerを使って ボタンを ツールバーの末尾に追加します
スペースが広がり Habitatの概要に 集中しやすくなりました TabViewをナビゲーションする際に より分かりやすくしたいです さらに 裏庭のエサや水が少ない場合に 気が付きやすくします 背景にグラデーションを適用して これを実現します 各タブのタイトルも便利ですが カラーにすることで 一目で見やすくなり 詳細表示のどこにいるかが明確になります エサや水が不足している場合に 裏庭の状態を強調できます システムグラデーションは フォアグラウンドの要素との コントラストを保ちながら ステータスを伝えられる良い方法です ContainerBackgroundモディファイアと グラデーションを使って実現します まず 元の背景を削除します BackyardViewに 現在のエサと水の量に基づいて 基づいて 背景色を決定する 関数を追加します 量が少ないと背景が赤くなり 補充が必要であることを知らせます 役に立つcomputed変数も追加しておきます この算出プロパティを containerBackgroundモディファイアに渡します
このモディファイアは ContainerBackgroundPlacementと同様 グラデーションを渡す ShapeStyleを受け取ります ここでは TabView用に指定します
また 背景が変わった時に ゲージの色も変えます 同じく算出した 色の変数を渡します
containerBackgroundモディファイアを TabView内の他のビューに適用し アプリのアクセントカラーを使います
スクロールすると グラデーションが フォアグラウンドの要素と うまく対比しているのが分かります また ツールバーボタンをタップすると 背景のグラデーションが変化します
最後の仕上げとして マテリアルを生かして 重要な情報を強調します マテリアルはプラットフォームに関係なく 利用可能ですが watchOS 10で 新たに追加されました
フォアグラウンドと背景の要素を区別し 視覚的な華やかさを加える良い方法です 画面上の情報を表面化したり 強調することができます アプリ内に マテリアルや バイブランスを使える場所があります 見てみましょう まず 裏庭のタイトルの 背景の影を マテリアルを使った背景に置き換えます セルの背景はカラフルですが マテリアルを追加すると タイトルを見やすくできます
あまり気にすることが無い 各裏庭を訪れた鳥の数は サマリービューで確認できます 裏庭の詳細ビューに移動せずに リストビューで 見ることができると良いですね 別のオーバーレイを追加し 数字の背景にマテリアルを設定します watchOSアプリは 暗い背景を使う傾向があるので マテリアルはデフォルトで ダーク系になっています 裏庭は明るくカラフルなので ライト系に切り替えます
これでBackyard Birdsアプリが watchOS 10向けにアップデートされました
大きな変更点をおさらいしましょう NavigationSplitViewを リストに追加しました そして リストを Vertical TabViewに変更しました 裏庭ごとにツールバーに機能を追加し 美しいグラデーションを追加しました 最後に 役に立つ情報を表面化するため マテリアルを使いました ご参加ありがとうございました 今年はApple Watchにとって大きな年です ぜひ多くのセッションを ご覧になってください Backyard Birdsについて詳しくは 「Apple Watchのスマートスタック向け ウィジェットの構築」をご確認ください みなさんのアプリがwatchOS 10で輝く アップデートをお待ちしています
-
-
4:02 - NavigationSplitView
NavigationSplitView { List(backyardsData.backyards, selection: $selectedBackyard) { backyard in BackyardCell(backyard: backyard) } .listStyle(.carousel) } detail: { if let selectedBackyard { BackyardView(backyard: selectedBackyard) } else { BackyardUnavailableView() } }
-
6:18 - Vertical TabView
TabView { TodayView() .navigationTitle("Today") HabitatGaugeView(level: $waterLevel, habitatType: .water, tintColor: .blue) .navigationTitle("Water") HabitatGaugeView(level: $foodLevel, habitatType: .food, tintColor: .green) .navigationTitle("Food") List { VisitorView() .navigationTitle("Visitors") } } .tabViewStyle(.verticalPage)
-
8:37 - Add refill button to Toolbar
.toolbar { ToolbarItemGroup(placement: .bottomBar) { Spacer() Button { level = Int(min(100, Double(level) + 5)) } label: { Label("Add", systemImage: "plus") } } }
-
9:48 - HabitatGaugeView background color function and variables
func backgroundColor(_ level: Int, for type: HabitatType) -> Color { let color: Color = type == .food ? .green : .blue return level < 40 ? .red : color } var waterColor: Color { backgroundColor(waterLevel, for: .water) } var foodColor: Color { backgroundColor(foodLevel, for: .food) }
-
10:10 - .containerBackground within TabView
TabView { TodayView() .navigationTitle("Today") .containerBackground(Color.accentColor.gradient, for: .tabView) HabitatGaugeView(level: $waterLevel, habitatType: .water, tintColor: waterColor) .navigationTitle("Water") .containerBackground(waterColor.gradient, for: .tabView) HabitatGaugeView(level: $foodLevel, habitatType: .food, tintColor: foodColor) .navigationTitle("Food") .containerBackground(foodColor.gradient, for: .tabView) List { VisitorView() .navigationTitle("Visitors") .containerBackground(Color.accentColor.gradient, for: .tabView) } } .tabViewStyle(.verticalPage) .environmentObject(backyard) .navigationTitle(backyard.displayName)
-
11:38 - Add material to the backyard name
.foregroundStyle(.secondary) .background(Material.ultraThin, in: RoundedRectangle(cornerRadius: 7))
-
12:15 - Visitor score overlay with materials
.overlay(alignment: .topTrailing) { Text("\(backyard.visitorScore)") .frame(width: 25, height: 25) .foregroundStyle(.secondary) .background(.ultraThinMaterial, in: .circle) .padding(.top, 5) }
-
12:20 - Light materials
.environment(\.colorScheme, .light)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。