View in English

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

クイックリンク

5 クイックリンク

ビデオ

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

その他のビデオ

ストリーミングはほとんどのブラウザと
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を愛するユーザー向けに、個性とカスタマイズをふんだんに盛り込んだ文字盤を作成することができます。

    リソース

    • Building a watchOS app
    • ClockKit
    • Creating and updating a complication’s timeline
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC22

    • WidgetKitのコンプリケーションによるさらなる進化

    WWDC21

    • Swiftの並行処理: サンプルAppの更新

    WWDC20

    • 常に最新のコンプリケーションを
    • Apple Watchのコンプリケーションの作成
    • SwiftUIの新機能
    • Watch Face Sharingとの出会い
  • このビデオを検索

    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()
          }
      }

Developer Footer

  • ビデオ
  • WWDC20
  • 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.
    利用規約 プライバシーポリシー 契約とガイドライン