ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
ウィジェットにおけるSwiftUIビューの構築
ウィジェットはAppが提供する一部の情報を表示し、ホーム画面やTodayビューに配置することもできます。SwiftUIを用いて、ウィジェットのビューを最初から構築する手順をご説明します。ウィジェットに特化した構成に必要となるシンタックスをブラッシュアップし、そのコマンドを取り込み、一目で分かりやすい体験のためにウィジェットのインターフェースをカスタマイズする方法もお伝えします。ウィジェットについての更なる情報は"Meet WidgetKit"と"Widgets Code-along"をご覧ください。
リソース
- Building Widgets Using WidgetKit and SwiftUI
- Creating a widget extension
- Human Interface Guidelines: Widgets
- Keeping a widget up to date
- Learn more about creating widgets
- WidgetKit
関連ビデオ
WWDC21
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ “ウィジェットにSwiftUIビューを作成する” iOSシステムエクスペリエンスチームの エンジニアのニルスです 今日は ウィジェット用のSwiftUIビューを ビルドする方法をご紹介します
最初に SwiftUIでウィジェットが どのように有効化されているかをお話しします 次にウィジェットのビューを 一緒にビルドすることをメインに据え 最後にウィジェットをすばらしいものにする 新しいAPIをいくつかお見せします
SwiftUIとWidgetKitを使えば ビューのタイムラインを ホーム画面に適切なタイミングで 表示できます SwiftUIの適応性のおかげで iOSとmacOSの両方に デプロイするウィジェットを 書くことができます ウィジェットは自己完結型なので iOS 14やmacOS Big Surで SwiftUIを使ったり 学習したりするのに最適です たとえSwiftUIが非対応の古いOSに デプロイする必要があっても有益です 私は最近コーヒーをよく飲みます 飲みすぎる日もあるくらいです そこで私は 飲んでいるカフェイン飲料のログを 記録するアプリケーションを作りました これは体内のカフェインの 摂取量の推測することもでできます “ワイアード”と名づけました ウィジェットはすばらしい機能だと思います カフェインをどの程度 摂取しているかを 一目で確認できるからです ウィジェットを このような見た目したいとします
まずアプリケーションの外観の特徴と 配色の方法を見てください 上部は現在の私の体内のカフェイン量で 下部は最後に飲んだの飲み物と経過した時間です
カフェイン量の表示の背景に注目すると ウィジェットの形状と同心円状になっています
またウィジェット下部の経過時間は リアルタイムで常に正確に表示しています
では SwiftUIで 簡単に作成できるか試してみましょう
すでにタイムラインを読み込んだ ウィジェットコンフィギュレーションなので ウィジェットのビューの作成に フォーカスできます 今回 私はSwiftUIを使って ウィジェットビューをビルドします つまり あなたのアプリケーションでも 同じように使えるということです
これが私のビューと そのプレビューです Widget Preview Contextを使いながら 表示させたいウィジェットファミリーの プレビューを指示します この場合はsystem Smallです
まずUIを駆動する データの構造体を定義してみましょう
Caffeine Widget Dataには 3つのプロパティがあり それぞれカフェインの量と飲み物の名前 そして飲んだ日付です またプレビューをリアルに見せるために プレビュー値はsteady constantを使います
ではプロパティを ビューに追加してみましょう
次にプレビューデータを使うために プレビューを更新します
これでビューのビルドを始められるので コンテンツを追加してみましょう
ビューを縦に重ねるには VStackを使います 上部にある本文フォントが太字の “caffeine”という文字列には 定義済みのアセットカタログにある カスタムカラーが使われています
その下に表示されている量は 大きなフォントですが 見た目は同じです フォントが大きい理由は レイアウト上で 必要ならば文字を縮小できるようにするためです なので ここで最小限のスケールファクタを 設定したのです
次はウィジェットに 個性を与えてみましょう ZStackを使って背面に 背景色を付けてみます ZStackを使えば 互いのトップに ビューを重ねて配置できます
お気づきでしょうが ウィジェットが自動的に 形状 サイズ 角丸をシステムから取得しました
では 最後に飲んだ飲み物の名前と 経過時間の情報も加えていきます
経過時間の表示に 新しいイニシャライザを使用しています それは日付とスタイルのフォーマットを 拾うものです このイニシャライザを使うと 指定した日付から時間の経過に従って 自動的にコンテンツが カウントアップまたはダウンします これは躍動感のあるウィジェットになる すばらしい方法です キャンバス内のlive previewボタンで 見え方を確認してみましょう 経過時間がカウントアップされています
文字列補間を使って内容を追加できるので このように“ago”という言葉を追加しました
文字列補間を使うとフレームワークが あなた用にローカライズされた文字キーを作成し このフォーマットが他の地域や 言語にも対応できるようになります
テキストの色が異なる 2つのグループコンテンツがあります 上部にある茶色のテキストと その下にある白いテキストです これら2つをVStacksで分割し その間にSpacerを追加します このテキストをクリックし “Embed in VStack”を選択します
このテキストをVStackの中に移動させます
次にこのテキストも同様に “Embed in VStack”を選択します
そして2番目のテキストを 内側に移動させます
それから両者の間にSpacerを追加します
両方のVStacksを左寄せにしてみます キャンバスを使う場合は vertical stackセクションの leadingボタンをクリックします
ここと―
ここです
少し複雑になってきたので 下と上の部分を抽出して 固有のサブビューに分割します SwiftUIなのでビューが安く ほとんどコストがかかりません
ここへ移動してVStackをクリックし “ExtractedView”を選択します これをCaffeine Amount Viewと 名づけましょう
データを保持するために プロパティを追加しましょう
それから下のVStackについても 同様に行います “Extract Subview”をクリックし これを“Drink view”と名づけましょう
そしてここにも 同じプロパティを追加します
最後にデータを動かしてみましょう
見た目は同じですが よりよいコード構造でビルドできます
中央寄せにする代わりに コンテンツを左寄せにします CaffeineAmountViewのコンテンツを HStack内にラップし最後にSpacerを追加します 移動して“Embed in HStack”を クリックします
“HStack”つまり水平スタックを使用すると ビューを隣り合わせに配置できます 最後にSpacerを置くことで 左端に押し寄せるように指示を出しています
最小間隔を必要としないため 最小の長さをゼロにすることで コンテンツができるだけ多くの スペースを取ることができます
見栄えをよくするため パティングを追加してみましょう SwiftUIだからこそ キャンバスで できるのです メインのVStackにカーソルを置きます
そしてAttributes Inspectorの paddingセクション内で 4つのチェックボタンをクリックします
パディングで数値を 指定していないことが分かります 動作しているデバイスと コンフィギュレーションに対し SwiftUIが適切なデフォルト値を 使用するのです
Caffeine Amount Viewを強調するための 指示を背景に出してみます
アセットカタログにある “latte”という色を使います 4つのチェックボックスをクリックし 再度 パディングを追加します
少し多すぎるので 数値を8にします
この形状の角は 丸みを帯びていませんね Human Interface Guidelines for Widgetsにある通り 角丸四角形はウィジェットの ビジュアルデザイン言語の重要なパーツです ではこの角も丸めてみます
このように角丸モディファイアの コードを使えるはずです
よさそうな値を見つけてください しかし時に 別のデバイスがウィジェットの 半径を変えてしまうことがあり少し厄介です
iOS14ではもっといい方法があります 新機能である Container Relative Shapeです
これは新しい形状タイプのひとつです 形状の位置に基づいて 適切な角丸を持った親コンテナにより 最も近いコンテナ形状のパスを取得します この例ではシステムが ウィジェットのコンテナ形状を定義するので 同心円状の角の取得が とても簡単に行えます
メインのVStackのパディングの値を変えると Caffeine Amount Viewの角半径が変化します そのため周りの境界線の太さが その角の曲線周りで一定に保たれるのです
最後に一番大切なコンテンツを 指示しましょう Spacerを使って少し空間を作ります
さあ 私たちが目指していた デザインが完成しました いいデザインだと思います ホーム画面に追加されるのが楽しみです ダークモードでの見え方を 確認してみましょう まずプレビューを複製してから モディファイアを追加してダークモードにします
配色はすべて 外観を暗くする変化を定義した アセットカタログから引っ張っているので ウィジェットが自動的に ダークモードを適用します
私の母もコーヒーをよく飲むので ワイアードを知ったらきっと喜ぶでしょう しかし母には下部の小さな文字が 読みにくいかもしれません そこで大きな文字を好む すべてのユーザーのために dynamic typeをサポートする ウィジェットに更新してみましょう まずは新しいプレビューを追加し より大きなサイズのカテゴリの ウィジェットを確認します
ここではsize categoryを extra Extra Extra Largeにしました
すばらしい見栄えです SwiftUIの適正のおかげで 何も変える必要がありませんでした そして追加作業なしで より包括的なウィジェットをビルドしました
次にプレースホルダについてお話しします 優れたウィジェットには プレースホルダーが必要です 拡張からのビューを要求した場合や デバイスがブロックされた場合でも システムが使えるためです ウィジェットと同じ見た目ですが 具体的なコンテンツはありません プレースホルダーとしても使えるように ビューを修正してみましょう まず既存のものをコピーして 別のプレビューを作成します
そして“is placeholder true” モディファイアを追加します
自動的にコンテンツが入れ替わって テキスト部分が丸みを帯びた四角形になりました コンテンツにマッチするように スタイルが作られたのです
プレースホルダに テキストを保存したい場合は “is placeholder false” モディファイアを追加します “caffeine”という言葉を 追加しましょう
ウィジェットのプレースホルダとして使用することで ビューを更新しました 簡単ですね
この“is placeholder”モディファイアは 後のシードで利用できるようになります ウィジェットは3つのファミリーで 構成されています smallとmediumそしてlargeです 別のウィジェットファミリーを使い ウィジェットの更新を見てみましょう system Mediumで別のプレビューを 追加して始めます
よさそうに見えますが 余分なスペースがあります
このアプリケーションではユーザーが 飲み物の写真を記録できます そこで写真をウィジェットに入れ 限られた画面を上手に使いましょう まず写真の名前を保存するために データ構造体にプロパティを追加します
そしてプレビューアセットカタログから サンプル写真を追加します
写真をビューに追加します system Mediumでは 飲み物の写真だけを表示させます この条件付きのレイアウトを作成するため ウィジェットファミリーに環境変数を追加します
写真を既存のコンテンツの横に配置したいので すべてのコンテンツをHStack内にラップします
もしsystem Mediumウィジェットで かつ写真を表示する場合は Imageを追加しましょう
そしてresizableにします
いいですね
最後に 別のプレビューを追加して サイズ用プレースホルダを見てみましょう コツがつかめてきたでしょう 既存のものをコピーしてデモティファイを追加し プレースホルダーを作成します
SwiftUIが自動的に画像を 背景着色されたコンテンツに置き換えましたね system Mediumのプレースホルダーを作成するのに 追加作業はしていません すごいでしょう? SwiftUIでウィジェットビューを ビルドすることはこんなに簡単です 先ほどデモでお見せした 2つの新しいAPIについてお話しします
まずウィジェットで美しく見えるような 角丸の作り方です 角丸四角形を入れ子にする時 全く同じ角半径を使うことは避けたいでしょう 同心円状がいいはずです
iOS14ならそれが難なくできます ビューの背景として Container Relative Shapeをセットすると SwiftUIがそこから取得します 簡単すぎるくらいです
iOS14にはスタイルに従って 日付をフォーマットするための 新しいイニシャライザを テキストに追加しました そのためカウントダウンやタイマー 絶対日付や相対日付などを作ることができます これは時が経つにつれ 自動的に更新されるので 躍動感のあるウィジェットになる 優れた方法です
では まとめましょう SwiftUIで魅力的なウィジェット体験を ユーザーに提供できます ウィジェットはSwiftUIに既存の 適用可能なレイアウト用のサポートを活用します
ウィジェット間で共通した現象を より簡単にする新しいAPIを追加しました ウィジェットだけでなくどこでも動作するので ぜひアプリケーションにも使ってみてください
ウィジェットのタイムラインの詳細は “Meet WidgetKit”をご覧ください また私の同僚のイジーの “Widgets Code-along”では ScratchからWidgetKitを使って ウィジェットを作る過程が見られます すてきなWWDCをお過ごしください ありがとうございました
-
-
18:40 - Concentric corner radius with ContainerRelativeShape
// Concentric corner radius with ContainerRelativeShape struct PillView : View { var title: Text var color: Color var body: some View { Text(title) .background(ContainerRelativeShape().fill(color)) } }
-
19:09 - Displaying date and time
// Displaying date and time // June 3, 2019 Text(event.startDate, style: .date) // 11:23PM Text(event.startDate, style: .time) // 9:30AM - 3:30PM Text(event.startDate...event.endDate) // +2 hours // -3 months Text(event.startDate, style: .offset) // 2 hours, 23 minutes – Automatically updating as time pass Text(event.startDate, style: .relative) // 36:59:01 – Automatically updating as time pass Text(event.startDate, style: .timer)
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。