ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
SwiftUIでコンプリケーションを構築する
SwiftUIを使って、Apple Watchのグラフィックコンプリケーションにスパイスを効かせてみましょう。メリディアンやインフォグラフといった文字盤のコンプリケーション上でのカスタムSwiftUIビューの使い方をお伝えします。コンプリケーションを作成する際のベストプラクティスをご紹介し、Xcode 12で作成中のものをプレビューする方法についてもお伝えします。このセッションを最大限に活用するためには、SwiftUIの基礎知識とApple Watchでのコンプリケーション構築に慣れていることが望まれます。概要については、"Create Complications for Apple Watch"をご覧になり、"Building watchOS App Interfaces with SwiftUI"をお読みください。SwiftUIでグラフィックコンプリケーションを構築する方法を理解したら、コンプリケーションや文字盤の共有といった他のwatchOS 7の機能と合わせ、Appを愛するユーザー向けに、個性とカスタマイズをふんだんに盛り込んだ文字盤を作成することができます。
リソース
関連ビデオ
WWDC22
WWDC21
WWDC20
-
ダウンロード
WWDCへようこそ “SwiftUIでコンプリケーションを構築する” 私はマシュー・クーンス watchOS SwiftUI担当のエンジニアです
後ほど同僚のオーガストも登場の予定です SwiftUI complicationsを使用した 素晴らしい作品について話します Complicationsはタイムリーで的確なAppの情報を 文字盤に表示してくれる機能です Complicationsは非常に強力 かつ有用な機能ですから これを利用すれば複雑な情報の中の 必要な部分を 一目で直ちに理解できるように抽出してくれます たとえばUVI complicationは色が段階的に変化する 垂直方向のゲージを表示するので 今日は日焼け止めが必要かが 一目で分かるように示すことができます
UVIチャートのようなcomplicationsの 作成はかなり難しいことですが SwiftUI complicationsを使用すれば SwiftUIの知識をそのまま 文字盤へ生かすことができます もちろん Xcodeプレビューなしで SwiftUI complicationsは使えません これを使えば 異なるフェイスの complicationsを同時に見られます 本日 どうすればSwiftUI complicationsを 作ることができるのか話します この機能を実現するためには まずClockKitとSwiftUIの 新しいAPIを確認する必要があります
SwiftUIビューと 文字盤の色合いとの関係を知り ベストプラクティスを いくつか見ていきましょう まずAPIについてです
ComplicationsでSwiftUIビューを使用するため まずは実証済みのcomplication テンプレートを利用します ClockKitには数十ものテンプレートがあり 分かり易いレイアウトを提供してくれます watchOS7から新しいテンプレートが 追加されています これにより他のClockKitプロバイダの製品にも SwiftUIビューの適用が可能になりました これらのテンプレートはGraphic Corner Circular Rectangular
さらにはExtra Largeファミリーに適用されます しかしSwiftUI が最も輝くのは 1つのSwiftUI ビューだけを対象とする テンプレートを使用するときです テンプレートは個々のファミリーの描画のための 完備したキャンバスを提供します
さらにGraphicRectangularFullView テンプレートは 更に大きなキャンバスを描くことができる 全く新しいテンプレートです このキャンバスがあればSwiftUIを使用して あらゆる作業を行うことができます SwiftUIの強力な作画ライブラリを 自由自在に使用することができますから complicationsで使用する新しいデザインを 簡単に作成できます ここに示すDawn Patrolからの ウエーブチャートがその例です これがSwiftUIビューを ClockKitテンプレートに取り込む方法です またcomplicationを より強力にして柔軟性を与えるため SwiftUIにも変更を加えました
まず最初にテキストについて話します テキストを表示するcomplicationファミリーを意識して テキストをアップデートしました それぞれのファミリーごとに デフォルトのフォントサイズが設定されています たとえばGraphicRectangular complication上の ここに示す同じテキストが Extra Largeフェイス上では はるかに大きく表示されます デフォルトフォントも SF Roundedへ変更されていますから このフェイスにうまく馴染んでいます
さらにこのテキストが備える 新しい日付書式設定機能が 文字盤上で素晴らしく機能しています 特に相対オフセットおよびタイマースタイルは 文字盤上で 自動的に最新の状態に保たれます たとえば この日付に相対スタイルを適用することにより 日付が現在との比較で常に正確に表示されます タイマースタイルについても同様です 日付を文字列内部にスペースを補間して 挿入することができます そうすると残り時間が 自動的にSourdough Timer上に表示されます
このようにテキスト処理機能が改善されています 次に頻繁に使用されるコントロールの 2つの例を紹介します これらも我々が SwiftUIへ盛り込んだ機能です そのコントロールとはProgress ViewとGaugeです
Progress ViewとGaugeは どちらも非常に有用ですが 同時にどちらも特定の目的を持っています
Progress View は時間とともに 直線的に進行する情報 たとえば音楽ですね 一方Gaugeは時間とともに変化する情報 たとえば温度に向いています まずProgress Viewからスタートしましょう
最も単純なセットアップを考えると Progress Viewは1つの値だけを持ち 1つのスタイルを設定することができます このケースでは Circularスタイルを使用しています
Progress Viewにはその使用目的を示す ラベルを追加することができます このケースでは音符を表す SFシンボルを使用しています
最後にProgress Viewは色付けも可能です 色を付けることによって 私たちの音楽Progress Viewが完成します
Progress Viewはリニアスタイルで 使用することも可能です すべてのAPIはあなたが予想するとおりに 機能してくれます 次にGaugeを見てみましょう
Gaugeは山ほどの構成オプションを備えた 非常に強力なコントロールです ご覧ください
ここに示すのは庭の土の酸性度レベルを 表示するだけのシンプルなGaugeです 使用しているのはCircularGaugeスタイルです
現在の値を示すラベルを追加することができます このラベルはGaugeの中央に表示され これによって前後関係が一目で分かります
Gaugeの使用目的によっては 開始時と終了時の値をラベルで示すのが有用です このケースではGaugeは3から10の範囲で 変化します これらのラベルを追加してみましょう 最小値と最大値を示すラベルです
Progress Viewと同じように Gaugeにも色を付けることができます ここでは緑色を追加してみます
しかしGaugeがその本領を発揮するのは 色にグラデーションを持たせるときです そのためにSwiftUIのgradientを使用します
Gaugeを直線スタイルで表示することも可能です Rectangular complicationで 見栄えの良い方法ですし Modular Compactフェイス上で 表示したように見えます これがGauge APIです 1つ覚えておいて頂きたいのは GaugeとProgress Viewsはどちらも SwiftUI上で利用できますがユーザーが構築する 新規コントロールとして提供されていることです たとえばRectangular complicationで Circular Gaugeを使用することできますが
直にAppで Gaugeを使用することも可能です
SwiftUIとClockKitに追加した 新しいAPIをご紹介しました 次に 私が好きな文字盤の 機能について話します それは文字盤への色付けです
文字盤は色のすべての範囲を サポートしていますから さらに進んだパーソナライズが 可能となっています Complicationがフェイスカラーを取り込んで フェイスに独自のスタイルを与えてくれます
フェイスの種類によっては 更に一歩進める機能を備えています Solar Dialフェイスでは日付が進むのに応じて 色彩と個々のcomplicationの色を変化させます 色付けした文字盤上で あなたのcomplicationがどのように振る舞うかは そのcomplicationのデザインに依存します それでは文字盤の色付けが どのように機能するのかを見ていきましょう これは青いサークル上の黄色いアップルを示す フルカラービューです
文字盤に色付けをするとき 2つの色付け効果のいずれかが適用されます
その一つは色付けの非飽和度効果です 2番目は色付けのオパシティ効果です
まず最初は色付けの非飽和度について話します
非飽和色付けモードは complicationのデフォルト着色モードです 文字盤に色を付けると ビューのグレイスケールバージョンができます
何種類かのフェイス たとえばExtra Largeのフェイスの場合は この非飽和色付けビュー全体に 1つの色が施されることがあります 文字盤上で非飽和色付けされる タイプのSwiftUI complicationを― 構築する方法を見てゆきましょう
ここに示すのは私のビューの 対応するコードの例ですが 1つのサークルとアップル画像の ZStackになっています
文字盤上できれいに見えています
ここで文字盤の色を 赤に変えてみると ご覧のようにデフォルトの 非飽和モードが適用されますから ビューが文字盤上で 自動的に非飽和色へ変化します
次はExtra Largeフェイス上の場合には 非飽和ビュー全体が1つの色で表示されます 非常に簡単ですね SwiftUIビューに変更を加えることなしに 色付きcomplicationが得られました
そうは言いましたがcomplicationの色の 選択については注意が必要です
もし類似した明るさの色を 選択したとしたらどうでしょう ビューを非飽和化すると同時に アップルが見えなくなってしまいます 非飽和化したときにビューがどう見えるかを よく考えることが重要です
以上が非飽和色付けの説明でした 次に色付けのオパシティについて見ていきます 色を付けるときのデフォルト色付け法は 非飽和色ですが それに代わる方法として色のオパシティを 基準とした着色法を選択することができます この色付けスタイルはcomplicationの中に 色のレイヤーを作ることによって機能します レイヤーを形成することで文字盤の色を それぞれのレイヤーに割り付けることができます
フルカラービューからスタートしてみると まず必要なのはcomplicationに含まれる レイヤーを識別することです 文字盤は2つの明確に分かれた レイヤーをサポートします
この場合サークルを アップルから分離させています これらが我々の2つのレイヤーになります 次にその名前が示すように 文字盤はそれぞれのビューの オパシティのみを考慮します これらのビューが完全なオパシティを 備えているため 両方とも白く見えます
続いて文字盤は 適当なレイヤーに色を適用します それぞれの文字盤が それぞれのレイヤーに適用された色を決定します この場合文字盤はサークルの レイヤーが赤色となるように決定しました アップルのレイヤーは白色のままです
ここまで来ましたらレイヤーを再び合体させます 選択した色をどうレイヤーに反映させるかの 定義は文字盤のデザインによります たとえばExtra Largeフェイスであれば 赤いバックグラウンドに白いアップルの表示です
しかしメリディアンの文字盤上であれば 白いバックグランド上に赤く表示されます
それ以外のフェイス たとえばSolar Dialフェイスの場合 どちらのレイヤーにも異なる色が適用されます
我々の例に戻ります ただし今回はExtra Largeフェイスを使用します どうすればcomplicationが不透明色を 使用できるか見ていきましょう
サークルとアップルがそれぞれレイヤーの中で 異なるレイヤーとして存在するようにしたいのです デフォルト設定ではすべてのビューコンテンツが バックグラウンドレイヤーに存在するものと見なします
complicationのForegroundモディファイアを 使用することにより 私はアップルイメージが 前面レイヤーに押し上げられるように設定しました 一方サークルはバックグラウンドレイヤーに 留まっています これで両者は別なレイヤーに分かれましたから 不透明な色付けが機能するようになります
ここで文字盤の色を 赤に変えてみると アップルの色が白くなりサークルが赤くなります
再びフェイスの色を変えてみると バックグラウンドも 連動して変わることが分かります Extra Largeフェイス上では バックグラウンドレイヤーに 文字盤の色が与えられていました 別のフェイスにも目を向けてみましょう
メリディアンの文字盤の場合は反対側のレイヤーが 着色されていることに気付かれるでしょう
それがオパシティ色付けであり ここではビューの階層構造の中に区別された 複数の不透明レイヤーを作成します 文字盤がレイヤーに色を割り当てることで 目を見張るような結果を引き出すことができます 場合によっては 着色のためビューへ追加的な変更を 施したい場合が生じます たとえば バックグランドの色を変更して グラデーションを使用したくなるかも知れません
またバックグラウンドを 完全に取り除きたいこともあるでしょう 新しく導入されたcomplicationRenderingModeを 使用すればこのような操作も可能です このレンダリングモードは2つの値を持っていて ビューをフルカラーフェイス用に レンダリングする場合はfullColor ビューを色の付いたフェイス上に 表示させるときはtintedを使用します
現在設定されている値は環境から取得します
それでは私たちの例に戻って complicationRenderingModeの使い方を 調べていきます
まず最初に環境を使用して現在設定されている レンダリングモードを取得します
次に私たちのサークルのフィルを変更し complicationを“color”または“tinted” に 設定することによってレンダリングモードが 使用できるようにします
レンダリングモードの設定をチェックするために スイッチ文を追加します
現在の設定がfullColorである場合は 青色のフィルカラーを使用して サークルを正確に現状のまま保ちます
一方現在の設定が tintedである場合は フィルを全面的に変更します 1つの色だけで着色するのではなく LinearGradientを使用します
特にここでは ビューのオパシティのみを変化させる グラジエントを使用します 以前の説明からも分かるように これはcolor opacity complicationに他なりません したがって オンスクリーン表示するときに考慮すべき項目は ビューのオパシティだけなのです 変更できるのはオパシティだけなのですから グラジエントはオパシティ1から オパシティ0まで変化します
次に取り扱うのはtinted complicationですが こちらは tintedモードでは オパシティグラジエントフィルを持っており fullColorモードでは 青色のフィルを持っています これで必要な情報が揃いました それではキーとなるポイントをまとめます
デフォルトではSwiftUIビューは 文字盤上で非飽和化されます color opacity complicationが必要なのであれば complicationForegroundモディファイアを 使用して 着色のためにビューの部分を ひとまとめにします そして最後にfullColorと tinted complicationのために complicationRenderingModeを使用して ビューの高度なカスタム化を行います ここまでの説明で SwiftUI complicationsの作成に使用できる 新規APIのすべてについて学習しました 実際に使用したときに何が起こるのでしょうか 説明はオーガストに引き継ぎたいと思います ありがとう マシュー 文字盤担当のエンジニア オーガスト・ヨキです Xcodeで学習した内容を実際に 使用する方法について説明します 以前 私たちはcomplicationを作成し 更新するためのサンプルコードを公開しました その名前はCoffee Trackerです そのAppの見た目がこちらです
Coffee Trackerそれ自体が 複数のcomplicationを含んでいます したがって新しいSwiftUI complicationsの機能を 示すための絶好の素材なのです
マシューと私は新しいSwiftUIビューの 組み込みに取り組んできました このビューの目的はユーザーの皆様の カフェイン消費量を示すことです 先週消費したコーヒーの量をそれに対応する コーヒーカップの数として表示します さらにこのチャートには 複数の色が組み込まれています これらのビューはとても見栄えが良いですよね とても優れたGraphic Rectangular complicationに 育ってゆくでしょう それではSwiftUIとcomplicationテンプレートを 組み込む方法と色付けの2つのオプションを サポートする方法を知るために Xcodeへ移動します 以前 AppのHistory Viewに 取り組んでいたことがあります そのとき私たちはビューに加えた変更を 簡単に見るためのプレビューを設定しました 単純なビューであれば何の変更もなしに complicationに含めることができます あるいは1~2つ程度の 新しいプロパティを定義するだけで complicationへの レンダリングが可能になるかも知れません
しかし私たちのチャートは相当に複雑ですから complicationで使用するビューを 新たに作成することにしました 別個にビューを作成することにより complicationに固有な任意の変更も カプセル化が可能になります
そこで新しいビューを プレビューに追加することにします その理由は私たちの 新しいComplicationHistoryViewばかりではなく AppバージョンのHistoryViewも 表示できるようにしておきたいからです これによって変更が単なる思い違いで ないことを示すことができます それではcomplicationで使用する対象として HistoryViewのHistoryChart部分を考えてみます
私たちのcomplicationをプレビューするため まずは新しいSwiftUIビューを使用して FullViewGraphicRectangularTemplateを作ります
ただしこのテンプレート自体は SwiftUIビューでなく テンプレートだけでプレビューはできません そのため CLKComplicationTemplateに 1つの新機能を加えました それがpreviewContextです previewContextはClockKitとSwiftUIの両方が いっしょにインポートされたときに定義されます この関数はSwiftUIビュー内で テンプレートのラッパーとして機能しますから どう変形すればcomplicationテンプレートを設定した 文字盤へうまく融合できるのかを Previewが知ることができます フェイス上ですべてのcomplicationテンプレートの プレビューを行い そのファミリーに最もうまくフィットする テンプレートを探しました SwiftUIの強力な機能のおかげで このcomplicationのルックスは ほぼ完成しており もうすぐ手離れする段階にあります しかしGraphic Rectangularフォントの デフォルトサイズは 今 表示しているタイプのcontentに対して まだ少し大きすぎるでしょう これを修正してみましょう
チャートにフォントモディファイアを追加して 私たちのcomplicationで表示するのに 適したサイズを設定します
同時にGraphicRectangularFullViewテンプレートの 表示に利用できるスペースを確保します complicationの安全なエリアについては マシューが後ほど詳しく説明します ピッタリのフォントサイズになりました ご覧のとおり このチャートは文字盤上で 他のcomplicationと隣り合わせになっています そのためcomplicationデータに 多少のコンテキストを与えなければなりません このコンテキストを与える手段として 最適なのはタイトルを与えることです
すべてがSwiftUI上での操作ですから テキストとして""Weekly Coffee”を追加してみます さらにこれをVStackのHistory Chartと共に ラッピングします これで はるかに 洗練されたルックスになりました しかしフェイスに色が付いたときに complicationはどのように見えるのでしょう プレビューのフェイスカラーとして 青色を設定してみます
ごちゃごちゃになりはしませんが 全部の色が見えなくなってしまいます タイトルをフェイスの色合いに適合させるために complicationForegroundを使用してみましょう
これでタイトルの色が自動的に調整されて フェイスの色にマッチするようになりました 色付けのサポートも重点の一つですから 色付けに焦点を合わせて プレビューを検討してみます
色付きフェイスのすぐ隣に 複数の色を持つフェイスを置くとこのように見えます すぐに気が付くように complicationForegroundを使用すると グラジエントとGaugeが 見えなくなってしまいます その理由は色付けをサポートすると同時に 私たちのcomplicationが 非飽和化されなくなるためです その代わりにビュー階層構造の オパシティだけが使用されるのです つまり階層構造のすべてが オパシティ値だけに集約され complicationForegroundで マーキングしたパーツがグループ化されます グループ化されたパーツのすべてに 同じ色付けが適用されます 以前学習したように色付けを取り扱う 別な方法があります complicationRenderingModeの環境値です これを利用して色付けに対応する チャートの挙動を変更してみます まず最初にプレビューに色を付けておきます これにより 別ファイルに加える変更に同期してcomplicationが どの更新するかで観察することができます ここに示すビューでは 指定された日付に対応するカラムが作成されます
complicationRenderingModeのために 新しい環境プロパティを追加して その新規プロパティを私たちの カスタムHistoryGaugeStyleへ引き渡します これによって着色したときに バックグランドが隠されることになります チャートのレンダリングがfullColorの場合とは 変化していることが分かりますね
complicationRenderingModeを 使用することによって ビュー階層構造の個々のピースを 変化させることが可能になります fullColorと着色レンダリングとの間で コードパスの大規模な分岐は生じません それではComplicationHistoryViewへ 戻ることにします これまでフェイスカラーを青色にしたときに 新しいcomplicationがどう見えるかを調べました サンプルプレビューが他の色だったとしたら どうでしょう?
ClockKitとSwiftUIのパワーを併用すれば PreviewFaceColorを列挙することができるので これを利用して挙動を同時に調べてみましょう この手法を用いることによりユーザーが 選択できるオプションを網羅しながら complicationのルックスに問題がないかを 調べ上げることができます SwiftUIとcomplicationテンプレートの使用法が どれほど簡単であるか complicationForegroundを使用すれば 着色を素早くサポートできることを説明しました またcomplicationRenderingModeを 使用すれば 微妙な色合い調整も可能なことを 説明しました 再びマシューの登場です ベストプラクティスについて説明があります ありがとう オーガスト 素晴らしいプレゼンでしたね SwiftUIによってウィークリーサマリービューのような チャートをシームレスに作成することができます これほど簡単にcomplicationに 組み込める方法はありませんでした 次の話題はSwiftUI complicationを構築するときに 考慮すべきベストプラクティスについてです
まず最初に知るべき重要事項は complicationのどこかをタップすると その都度Appが起動することです complicationはボタン ジャスチャー その他の対話的エレメントをサポートしません complicationの構築ではテキスト画像 および描画プリミティブのみを使用します
complicationに適合しないビューを 使おうとした場合に警告を発生するため 私たちはXcodeに新しい 実行時ワーニング機能を追加しました
最後にcomplicationが静的ビューから構成された 時系列であることを忘れないでください したがってSwiftUIアニメーションは サポートされていません
文字盤を常にハイレベルで 動作させるために ビューの性能特性にも―
留意して頂きたいと思います スクリーンに表示される前に すべての SwiftUIビューの性能を測定してください
それぞれのcomplicationで使用する画像の 適正サイズについては Human Interface Guidelineを始めとする 弊社ドキュメントを参照してください
また輪郭のぼやけや書式付きテキストなど ある種の描画属性については 実行時コストへの配慮も必要です 絶対に必要なものだけを使用するのが 良い方針です
性能の良くないビューを使用すると complication実行時に悪影響が起こります
実行時ワーニングに注意を払ってください このワーニングの例ではビューのサイズと 複雑性に対して警告を発しています
Complicationが このような実行時ワーニングを表示したならば ビルドエラーと考えてください お客様がベストな経験をできるようにするため complicationの出荷前にエラーを 完全につぶしておく必要があります
最後にレイアウトのベストプラクティスを いくつか紹介します それぞれのcomplicationには デフォルトフォントサイズが設定されているので 構築したいビューのガイドラインとして デフォルトフォントサイズを利用ください
たとえばExtra Large complicationは 描画キャンバスを持つことがありますが その目的は大型で見やすい情報の 提供にあることに留意ください
Circularと Rectangular complicationファミリーは それぞれが特有の形状で コンテンツにマスクを施すことに ご注意を
またRectangular Full View complicationは 文字盤上のコンテンツに欠けがないよう レイアウトの一部にセーフエリアを設けています
たとえばここに示すような 大型描画エリアは Apple Watchディスプレイの文字盤の コーナー部分に 欠けが生ずる可能性があります デフォルトではcomplicationを あらゆる配置で割り付けても安全なように セーフエリアが設定されています complicationの全エリアを 使用したいのであれば edgesIgnoringSafeAreaモディファイアを 使用してください Weekly Coffee complicationで我々が行ったのが この使用法の例になります
これにより余裕スペースが若干増えます その場合もレイアウトに欠けが 生じないよう― 注意を払う必要があります SwiftUI complicationsを使用して実行できる 素晴らしい仕事を紹介してきました まず最初に SwiftUIの知識はそのまま文字盤でも 有効であることを話しました
次にText ProgressView Gaugeに対応する 強力な新しいAPIを紹介して これらを使用して文字盤に 色を付ける方法を説明しました
さらにXcodeプレビューを使用して 複数のcomplicationを文字盤の 色を変えながら同時に取り扱う方法を 説明しました
complication構築の経験がない あるいはcomplicationテンプレートの 知識をアップデートしたいとお考えの場合は “Create Complications for Apple Watch”を ご覧ください
さらにcomplicationに正しい情報を 正しいタイミングで表示する方法を知りたければ “Keep Your Complications Up to Date”を ご覧ください
ありがとうございました
-
-
3:17 - Relative Text
import SwiftUI import ClockKit struct RelativeText: View { var body: some View { VStack(alignment: .leading) { Text("Count Down") .font(.headline) .foregroundColor(.accentColor) Label("Nap Time", systemImage: "moon.fill") Text(Date() + 100, style: .relative) } .frame(maxWidth: .infinity, alignment: .leading) } } struct RelativeText_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicRectangularFullView(RelativeText()) .previewContext() } }
-
3:26 - Timer Text
import SwiftUI import ClockKit struct TimerText: View { var body: some View { VStack(alignment: .leading) { Label("Sourdough Timer", systemImage: "timer") .foregroundColor(.orange) Text("Time remaining: \(Date() + 100, style: .timer)") } .frame(maxWidth: .infinity, alignment: .leading) } } struct TimerText_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicRectangularFullView(TimerText()) .previewContext() } }
-
4:04 - Progress View Sample #1
import SwiftUI import ClockKit struct ProgressSample: View { var body: some View { ProgressView(value: 0.7) .progressViewStyle(CircularProgressViewStyle()) } } struct ProgressSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(ProgressSample()) .previewContext() } }
-
4:15 - Progress View Sample #2
import SwiftUI import ClockKit struct ProgressSample: View { var body: some View { ProgressView(value: 0.7) { Image(systemName: "music.note") } .progressViewStyle(CircularProgressViewStyle()) } } struct ProgressSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(ProgressSample()) .previewContext() } }
-
4:23 - Progress View Sample #3
import SwiftUI import ClockKit struct ProgressSample: View { var body: some View { ProgressView(value: 0.7) { Image(systemName: "music.note") } .progressViewStyle(CircularProgressViewStyle(tint: .red)) } } struct ProgressSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(ProgressSample()) .previewContext() } }
-
4:29 - Progress View Sample #4
import SwiftUI import ClockKit struct ProgressSample: View { var body: some View { VStack(alignment: .leading) { Text("Water Reminder") .foregroundColor(.blue) Text("32 oz. consumed") ProgressView(value: 0.7) .progressViewStyle(LinearProgressViewStyle(tint: .blue)) } } } struct ProgressSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicRectangularFullView(ProgressSample()) .previewContext() } }
-
4:45 - Gauge Sample #1
import SwiftUI import ClockKit struct GaugeSample: View { var body: some View { Gauge(value: 5.8, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } .gaugeStyle(CircularGaugeStyle()) } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(GaugeSample()) .previewContext() } }
-
4:55 - Gauge Sample #2
import SwiftUI import ClockKit struct GaugeSample: View { @State var acidity = 5.8 var body: some View { Gauge(value: acidity, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } currentValueLabel: { Text("\(acidity, specifier: "%.1f")") } .gaugeStyle(CircularGaugeStyle()) } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(GaugeSample()) .previewContext() } }
-
5:02 - Gauge Sample #3
import SwiftUI import ClockKit struct GaugeSample: View { @State var acidity = 5.8 var body: some View { Gauge(value: acidity, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } currentValueLabel: { Text("\(acidity, specifier: "%.1f")") } minimumValueLabel: { Text("3") } maximumValueLabel: { Text("10") } .gaugeStyle(CircularGaugeStyle()) } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(GaugeSample()) .previewContext() } }
-
5:14 - Gauge Sample #4
import SwiftUI import ClockKit struct GaugeSample: View { @State var acidity = 5.8 var body: some View { Gauge(value: acidity, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } currentValueLabel: { Text("\(acidity, specifier: "%.1f")") } minimumValueLabel: { Text("3") } maximumValueLabel: { Text("10") } .gaugeStyle(CircularGaugeStyle(tint: .green)) } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(GaugeSample()) .previewContext() } }
-
5:21 - Gauge Sample #5
import SwiftUI import ClockKit struct GaugeSample: View { @State var acidity = 5.8 var body: some View { Gauge(value: acidity, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } currentValueLabel: { Text("\(acidity, specifier: "%.1f")") } minimumValueLabel: { Text("3") } maximumValueLabel: { Text("10") } .gaugeStyle( CircularGaugeStyle( tint: Gradient(colors: [.orange, .yellow, .green, .blue, .purple]) ) ) } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicCircularView(GaugeSample()) .previewContext() } }
-
5:34 - Gauge Sample #6
import SwiftUI import ClockKit struct GaugeSample: View { @State var acidity = 5.8 var body: some View { VStack(alignment: .leading) { Text("Garden Soil Acidity") .foregroundColor(.green) Gauge(value: acidity, in: 3...10) { Image(systemName: "drop.fill") .foregroundColor(.green) } currentValueLabel: { Text("\(acidity, specifier: "%.1f")") } minimumValueLabel: { Text("3") } maximumValueLabel: { Text("10") } .gaugeStyle( LinearGaugeStyle( tint: Gradient(colors: [.orange, .yellow, .green, .blue, .purple]) ) ) } } } struct GaugeSample_Previews: PreviewProvider { static var previews: some View { CLKComplicationTemplateGraphicRectangularFullView(GaugeSample()) .previewContext() } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。