ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Apple Watchのコンプリケーションの作成
Watch appにコンプリケーションを追加すると、ユーザーは一目で分かる最新情報を文字盤から直接利用できるようになります。ここではコンプリケーションの作成およびビルド方法を基礎から丁寧に示し、Multiple Complicationsをご紹介します。タイムラインを構成し、ファミリーやテンプレートを使用し、綿密なコンプリケーションエクスペリエンスの創造に関するベストプラクティスを見つけるための方法をご覧ください。
リソース
関連ビデオ
WWDC20
-
ダウンロード
こんにちは WWDCへようこそ
“Apple Watchのコンプリケーションの作成” ClockKitのエンジニアの マイケル・ケントです このセッションではApple Watch用の コンプリケーションと アプリケーションに追加する方法について お話しします コンプリケーションはユーザーに コンテンツを見せるすばらしい方法です コンプリケーションは文字盤上で 簡単に見ることができます watchOS 7では 高度なコンプリケーション体験を 今まで以上に簡単に作成可能にしました コンプリケーションは アプリケーションそのものと同じくらい ユーザー体験において重要なものだからです コンテンツをユーザーの 目に触れさせる最も簡単な方法です では アプリケーションに追加する方法は? これからお話しするのは コンプリケーションを支える構造である タイムラインについて 実現するために必要な詳細について データをコンプリケーションに 表示する方法 複数のコンプリケーションを アプリケーションから提供するという― watchOS 7の新機能を利用する方法について さらに その例をご紹介します まずタイムラインについてお話しします タイムラインはコンプリケーションにおいて 中心的な役割を担っています コンプリケーションのデータを 時系列的に示します タイムラインではコンプリケーションの すべてのデータが提供されますので ClockKitはすべての必要な情報を アプリケーションに一度問い合わせるだけで 指定した日付全体で コンプリケーションを自動で動かせます
アプリケーションに新しいデータがあり 追加のエントリを提供する必要があれば ClockKitにタイムラインを追加するか 完全に無効化するよう― 指示することもできます チームの同僚と ハワイ周辺でのクジラの目撃情報を 追跡するアプリケーションを開発しました マウイ島周辺に 何か所かある観測地点での 最近のクジラ目撃情報を見ることができます このアプリケーションから タイムラインの例を見てみましょう ホエールウォッチングツアーの スケジュールです 別々の場所で1日に 3つのツアーが予定されています これがClockKitに提示される タイムラインの例です いくつか違いがありますね まず 各ツアーには時間的な広がりがなく 点として時間が示されます なぜならコンプリケーションはエントリを 次の表示日が来るまで表示するからです 次に各ツアーに表示されている時刻は 実際の開始時刻よりも早くなっています これはユーザーが興味を持った場合 実際の開始時刻に間に合うよう― ツアーの前に 警告を出せるようにするためです すべてのタイプのデータが このように動作するわけではありません たとえば気温の予報の場合 予報される各時刻に合わせて エントリを表示します 上の方には現時点でコンプリケーションに 表示してほしいデータがあります 1日の時間が進んでいくにつれて 本日のツアーがなくなるまで 情報が更新されていくのが見えます
では コンプリケーションに 表示したいデータを 指定する方法について ご説明しましょう
コンプリケーションのファミリーとは 表示の違いによる分類方法です グラフィックファミリーは watchOS 7の新機能である― Graphic Extra Largeを除いて watchOS 5で導入されたものです ファミリー分けによってデータをより 視覚的に表示できます 異なる文字盤では使用できる コンプリケーションファミリーも違います 例を見てみましょう
Infograph文字盤はGraphic Cornerと Graphic Bezel さらにGraphic Circularを使います それはInfograph Modular文字盤で Graphic Rectanbularとともに使えます
これはGraphic Extra Largeで Extra Large文字盤でサポートされたものです Modular SmallとModular Largeは Modular文字盤で Utilitarian Small FlatはMotion文字盤で Utilitarian SmallとLargeは Utility文字盤で Extra Largeはコンプリケーションが Graphic Extra Largeファミリーを サポートしない場合 Extra Large文字盤で使われます このファミリーはシリーズ3の Extra Large文字盤でのみ使用されます 理想的には できるだけ多くの コンプリケーションファミリーを サポートしたいでしょう そうすればユーザーは 好きな文字盤で アプリケーションのコンプリケーションを 使えるようになります コンプリケーションテンプレートは ファミリー内の視覚的レイアウトを表します ここに様々なファミリーで利用可能な コンプリケーションテンプレートの 例をいくつか示します 各テンプレートは個別の ファミリーに紐づいていますが 共通の基盤クラスを継承しています CLKComplicationTemplateです
表示したいデータを最適に表示するために 選択可能なオプションはたくさんあります 利用可能なものについての詳細は デベロッパウェブサイトの ドキュメントをご参照ください それではタイムラインを提供するための プログラムの簡単な例を見てみましょう 最初にお話ししたいタイプは CLKComplicationTimelineEntryです コンプリケーションのタイムラインは このリストを提供することで生成できます 各々が特定の時間において コンプリケーションをどう表示するかを表します プロパティは次の2つだけです dateはこのエントリが 表示されるべき日付です そしてcomplicationTemplate エントリに表示したい データを含むテンプレートです 以前示したタイムライン例に戻ると 午前6時には その日の午前6時に 生成されたタイムラインエントリで Ma'alaea Harborでのツアーを表す complicationTemplateがあります 午前9時になると日付と テンプレートが変わります その日の残りの時間も同様です ClockKitとのやりとりの主な部分は CLKComplicationDataSourceに 準拠したオブジェクトの作成を 通じて行われます このプロトコルの中で必須の メソッドが次の1つだけあります コンプリケーションwithHandler用の getCurrentTimelineEntryです
これを実装するには 所与のコンプリケーションに 現在のタイムラインエントリの ハンドラを呼び出すだけです このコンプリケーションの詳細は 後ほど見ていきます
一部のコンプリケーションには 最新のエントリのみで充分です たとえば現在の野球のスコアや 現在のAppleの株価などです しかしコンプリケーションに将来のエントリを 含めるタイムラインを提供するなら 次の2つのメソッドも 実装する必要があります まず コンプリケーションwithHandler用の getTimelineEndDateで これは将来のどの時点で エントリを提供するかを指定します もう1つはコンプリケーションの日付期限 withHandler後のgetTimelineEntriesです これは説明すると長くなりますが 必要なことは 所与の日付の後にデータに対して 適切なエントリを 上限までできるだけ多く提供することです この日付は既に提供した最新の タイムラインエントリを表します 上限は一度に取り込むことができる エントリの上限数です それを超える提供があった場合 超えたものはすべて取りこぼされます では 新しいデータを取得し タイムラインの更新が必要な場合は? 選択肢は2つあります 1つはデータが完全に変更されて 以前に提供したエントリが すべて無効になった場合です この場合はCLKComplicationServerの 共有インスタンス上で コンプリケーション用のreloadTimelineを 呼び出します
たとえばマウイ島に 予期しない嵐が発生し すべてのホエールウォッチングツアーが キャンセルされたことを反映し ホエールタイムラインを 無効化したいような場合です
もう一つは 以前に提供したエントリが有効で 単純に追加のエントリが あることを通知したい場合 コンプリケーション用のextendTimelineを 呼び出します
ClockKitは現在ユーザーの文字盤に 表示されているコンプリケーションの タイムラインだけを追跡します これはactiveComplicationsプロパティで アプリケーションに通知されます
CLKComplicationオブジェクトを 直接作成する必要はありません 情報を得るには ここからか― 実装したデータソースメソッドに 渡すことでできます それでは コンプリケーションテンプレートを 作成する方法をお話ししましょう
コンプリケーションには いくつか制限があります Watchの画面は小さいため コンプリケーションはより小さくなるからです 同じ文字列を様々なテンプレートや コンプリケーションファミリーで 表示したいとしても それらはすべて全く異なる レイアウト上の制約を持っています 最良の使用体験を実現するために データプロバイダという概念を導入しました これにより ClockKitでフォーマットされた― 様々な場所やコンテキストで 同じ情報を一貫して表示できます コンプリケーションの具体的なレイアウトの 詳細はClockKitが アプリケーションに代わって処理するので ClockKitが柔軟に対応するために 充分な情報が必要です 意味をご説明します まず テキストから始めます Watchは時間に関するものです したがって日付を表示したいことが しばしばあるでしょう これはロング形式で日付を 書いたものですが 多くのコンプリケーションコンテキストでは 結局このように表示されます 何を表示しているのか分かりにくいです どう改善できるでしょう? CLKDateTextProviderと呼ばれる データプロバイダを使いましょう 表示したいことを宣言します この場合“Wednesday, September 23”です すると できるだけそれを表示しようとします しかしスペースに制約がある場合 より短いバージョンにフォールバックします
曜日のように 比較的有用性が 低い情報は欠落するかもしれません そして必要に応じ 日付の数字だけになるかもしれません
コードではこうなります 日付を与え CLKDateTextProviderを作成します そしてカレンダー単位は 一番長いものを選択します 次のような質問へ答えたい場合の方法は? “今日から 表示したい日付までは何日?” または“他の日付から 表示したい日付までは何日?” CLKRelativeDateTexProviderを 使用できます 最初の質問の場合は RelativeDateTextProviderは 現在の日付時刻に合わせて テキストを自動更新します 何もしなくても秒単位で 正確な数値が出ます これは様々な表示形式で使用でき 現在から日の入りまでの時間を このように表示したり パン生地の発酵が終わるまでの 時間をこのように表示したりできます
2番目の例では 終了日時を提供して “timer”スタイルを指定して 表示したい単位を指定します これは他のテキストプロバイダです たとえば時間テキストプロバイダは 日付テキストプロバイダと ほぼ同様に動作します ただし日付というより時間を表示します 時間間隔テキストプロバイダは 午前7:30から9:00までのような 時間の範囲を表示するために使えます 最後に単純なテキストプロバイダです これは文字列を表示します スペースに制限のあるコンテキスト用に その文字列がフォールバックする際の 短縮版も登録できます 画像プロバイダも 含んでいるデータを 様々なコンテキストで 使用できるという点で テキストプロバイダと似ています
大きな違いはコンテキストは 文字盤の色設定に 大きく左右されることです 多くの文字盤では ユーザーが 色の属性をカスタマイズできます コンプリケーションはそれと 整合性を取らなくてはなりません
一部の文字盤ではコンプリケーションの 画像全体に一色を適用します 別の文字盤では背景や前景からなる 複数色の画像が許容されます この一番下でご覧いただけるように タイマー 日の出 ストップウォッチがあります
CLKImageProviderがこれを 実現しているオブジェクトです グラフィックコンプリケーションファミリーは フルカラーの画像を表示できます したがってそのテンプレートは CLKFullColorImageProvidersを必要とします しかし一部のコンテキストではこれらの 画像コンプリケーションは色付けされます フルカラーの画像のみの場合 画像の彩度を下げて色付けします そうではなく独自の画像を 使いたい場合 CLKFullColorImageProviderで CLKImageProviderのフォールバック先を 指定できます CLKImageProviderで 画像を指定することで コンプリケーションが明るくなり 左上の他のコンプリケーションと同じ 白い色になったのが分かります コンプリケーションの色付けの 対応についての詳細は 2019年の“Exploring Tinting Graphic Complications”をご参照ください ゲージプロバイダはグラフや進捗を 図示するために必要なデータを カプセル化したものです 様々なコンプリケーションレイアウトに 対応します この例の 角と中央の 両方で表示されています
ゲージの色やグラデーション または表示する比率などは 最小限の作業でカスタマイズ可能です
進捗率をリアルタイムで 更新するゲージが必要であれば CLKTimeIntervalGaugeProvideが 使用できます 開始日と終了日を指定して 現時点における進捗を 自動で更新して表示できます
watchOS 7の新機能で SwiftUIをコンプリケーションで使用できます CLKFullColorImageProviderを使用する コンプリケーションテンプレートは すべてSwiftUIビューで代替できます
簡単にアプリケーションの他の部分の コンポーネントを再利用でき 簡単に独自のコンプリケーションを目立たせ 従来より簡単にユーザーを 確保できるようになりました
SwiftUIをコンプリケーションで利用する 方法の詳細は より深く説明した こちらのセッションをご覧ください
アプリケーションがユーザーにとって有用で 関連性のある情報でいっぱいで そのすべてへの簡単なアクセスを 提供したい場合はどうしますか? watchOS 7の新機能で 1つのアプリケーションから 複数のコンプリケーションを 提供できるようになりました ユーザーが手首をちらっと見ただけで データをユーザーに提示できる すばらしい方法です 文字盤をすべて自分のコンプリケーションで 埋めてそれを共有することもできます
複数のコンプリケーションをサポートするには CLKComplicationDataSourceで 実装を宣言します 関連するメソッドは次の2つです getComplicationDescriptors with-handlerは 現在アプリケーションがサポートしている コンプリケーションのリストを規定します
handleSharedComplicationDescriptorsは アプリケーションのコンプリケーションを含む 文字盤がWatchで共有された時に呼び出されて ClockKitがタイムラインエントリを 要求し始めることを通知します CLKComplicationDescriptorは コンプリケーションを定義する方法です その内容は アプリケーション内で一意の識別子
文字盤編集の際に表示される displayNameや このコンプリケーションがサポートする コンプリケーションファミリーのリスト さらに2つの選択可能で 相互に排他的なプロパティから構成されます これらには後で使用するカスタムデータを userInfo辞書とuserActivityで 含めることができます
ホエールウォッチアプリケーションは 数種類のコンプリケーションをサポートします そのうちいくつかは 各観測場所での クジラの目撃数に関するものです 新しい目撃例を素早く記録する コンプリケーションと シーズン全体のデータを 表示するコンプリケーションがあります これらがどう動作するか見てみましょう
getComplicationDescriptors with-handlerメソッドでは ComplicationDescriptorsの配列を 作成して ハンドラの呼び出しに使用します ここでデータモデル内の各観測地点を 反復して適用して それぞれに対し ComplicationDescriptorを作成します
これらを使って各観測地点での 目撃情報を表示します
次にコンプリケーション用の descriptorを追加して クジラの新しい目撃情報を記録し シーズン全体のデータを見るためにも使用します この最後のコンプリケーションが graphicRectangularファミリーのみサポート していることに気付いた人もいるでしょう 他はすべてのファミリーをサポートしています シーズンデータコンプリケーションは 多くの情報を表示するため graphicRectangularファミリーの 大きな描画領域だけが コンプリケーションに 意味のある方法です このリストを無効にする必要があれば reloadComplicationDescriptorsを CLKComplicationServerで呼び出して このメソッドを もう一度呼び出すことができます ホエールウォッチアプリケーションの例では ユーザーが選択した観測地点のみ 表示することになるでしょう それらについて更新があれば コンプリケーションも更新したいところです
ユーザーが現在文字盤で 使っているコンプリケーションの サポートを外すよう リストを更新した場合でも 該当するコンプリケーション向けの タイムラインエントリの要求は続けられます この場合も 有用な情報の提供を 続けられるよう 可能な限り努力してください
このメソッドは CLKComplicationServerの reloadTimelineForComplicationメソッドとは 異なることに注意してください 後者はアプリケーションが提供する コンプリケーションのリストを更新します 前者は特定のコンプリケーションの タイムラインを更新します
いつものように ユーザーがコンプリケーションをタップすると 対応するアプリケーションが起動します タップされたコンプリケーションのdescriptorが userActivityで作成されている場合 起動時にそれが使用されます いずれの場合でもuserInfo辞書内の 次のエントリが渡されます 現在表示されているコンプリケーションの タイムラインエントリの日付と コンプリケーションの識別子です
もちろんこの辞書にはデベロッパが定義する エントリを含みます それもcomplicationDescriptorで 定義します
サポートするコンプリケーション 記述方法についてお話ししました ClockKitがどのコンプリケーションに タイムラインエントリを要求しているのか 知る方法は?
既に2つのメソッドを見てきました getCurrentTimelineEntryと getTimelineEndDateです それぞれ タイプCLKComplicationの コンプリケーションパラメータをとります
complicationDescriptorに よく似ているように見えます しかし complicationDescriptorは コンプリケーションが何をサポートするか 定義するのに対し このオブジェクトは ユーザーの文字盤上のコンプリケーションの 具体的なインスタンスを表します したがってサポートする ファミリーのリストではなく 実際のコンプリケーションインスタンスの ファミリーを含むプロパティを持っています そしてもちろん userInfo辞書かuserActivityの descriptorで提供した情報も ここに含まれています 初期値のコンプリケーション識別子 というものがあります これはコンプリケーションの一つを指定 するために使うべきものでしょうか? 確かにそういう使い方もできます しかしそれは本来の目的ではありません watchOS 7以前で コンプリケーションを提供していて ユーザーがそれを文字盤に表示している場合 またはユーザーがその文字盤を共有し なおかつ 関連データの削除を選択した場合 CLKDefaultComplicationIdentifierの 識別子を持つコンプリケーションを確認されます コンプリケーションdescriptorのリストで 明示的にサポートしていない場合でもです これは非常に重要です このコンプリケーションはサポートするべきです サポートしない場合 文字盤上に 壊れたコンプリケーションが表示され続け しかもそれは皆さんのアプリケーションに 関連していると示されているのです どうすればよいでしょうか?
まず watchOS 7以前の コンプリケーションと同じ情報を表示したり アプリケーション内の最も人気がある情報や 関連性の高い情報を表示したり 単にアプリケーションの アイコンを表示したりすることで 少なくともユーザーは そのコンプリケーションが何なのか そしてアイコンをタップしたら何が起きるか 理解できるようにできます ホエールウォッチングアプリケーションの 詳細について見ていきましょう このメソッドは以前にも見ました 所定のコンプリケーションについて 現在のエントリを作成します
まだ確認していない もう1つのメソッドがあります コンプリケーションwithHandler用の getLocalizableSampleTemplateです これはCLKComplicationDataSource プロトコルの一部でもあります
それが要求するテンプレートは 文字盤編集やペアリングされた iPhone上のApple Watch アプリケーションで コンプリケーションを選択するために 使用されます テンプレートにはサンプルデータを含めましょう 各コンプリケーションつき1回しか要求されず 結果はキャッシュされるからです
このcreateTimelineEntryメソッドは これまで何回か見てきました かなり単純です テンプレートを作成して タイムラインエントリを作成し そこに日付を渡します
createTemplateメソッドの 詳細を見てみましょう 最初に テンプレートを作成するために 再利用する必要があるデータを取り出します コンプリケーションから観覧地点情報を 取り出します descriptorを作成したことを 思い出してください 様々な場合に対応するため FullColorImageProviderを作成します 目撃情報を記録するために SimpleTextProviderを作成します
最後に 初期設定コンプリケーション識別子に テンプレートを要求されるなど 何か予期しないことが起きた場合に フォールバックできるように 所定のファミリーに対する初期値テンプレートを 返すことができるクロージャーを作成します
作成するテンプレートを決定するために ファミリーと識別子の両方を graphicRectangularの SeasonDataコンプリケーションについて 有効にします GraphicRectanbularFullViewテンプレートを 作成します これにはデータを美しく視覚的に表示する SwiftUIビューがあります
graphicCircularの “LogSighting”コンプリケーションのために GraphicCircularStackImage テンプレートを作成します 先に作成したImageProviderと TextProviderを使います その他のあらゆる種類の graphicCircularコンプリケーションには 別のSwiftUIビューとして その場所での目撃に関する情報を 表示したいとします graphicCornerおよびgraphicExtraLargeも ほぼ同様です 観測地点データからの対応するテキストと imageProviderを含むコンプリケーション テンプレートを返します 他にもサポートする コンプリケーションそれぞれに 適切にテンプレートを 提供するための数多くの場合分けがありますが すべて似たようなものなので ここでは詳細には立ち入りません 初期値のコンプリケーション識別子のように 対処しようがないことでの 問い合わせがあった場合には 単に初期値のテンプレートを返します これはコンプリケーションのいくつかが どう動作するかを示したものです 2種類のGraphic Rectangular コンプリケーションと 2種類のGraphic Circularがあります SwiftUIを使って これらの美しいチャートを描画しました フルカラーと色付きコンテキストの両方で きれいに見えています watchOS 7では 文字盤上だけでユーザーに データを表示できる 機会がたくさんあります コンプリケーションを作成しましょう コンプリケーションを最新にするために データをタイムラインに提供しましょう カスタマイズされたコンプリケーション コンテンツをSwiftUIで作成しましょう 要求されたときに備えて 初期値のコンプリケーション識別子を 確実にサポートしましょう すばらしいコンプリケーションを 構築するための詳細情報は これらのセッションをご確認ください ご視聴ありがとうございます
-
-
4:54 - CLKComplicationDataSource - Required Methods
// CLKComplicationDataSource - Required class ComplicationController: NSObject, CLKComplicationDataSource { func getCurrentTimelineEntry( for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) { // Call the handler with the current timeline entry handler(createTimelineEntry(forComplication: complication, date: Date())) } }
-
5:16 - CLKComplicationDataSource - Timeline Support
// CLKComplicationDataSource - Timeline Support extension ComplicationController { func getTimelineEndDate( for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) { handler(timeline(for: complication)?.endDate) } func getTimelineEntries( for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) { handler(timeline(for: complication)?.entries(after: date, limit: limit)) } }
-
8:11 - CLKDateTextProvider initialization
let longDate: Date = DateComponents(year: 2020, month: 9, day: 23).date ?? Date() let units: NSCalendar.Unit = [.weekday, .month, .day] let textProvider = CLKDateTextProvider(date: longDate, units: units)
-
8:49 - CLKRelativeDateTextProvider initialization
let timerStart: Date = … let units: NSCalendar.Unit = [.hour, .minute, .second] let textProvider = CLKRelativeDateTextProvider(date: timerStart, style: .timer, units: units)
-
13:16 - CLKComplicationDataSource - Multiple Complication Support
// CLKComplicationDataSource - Multiple Complication Support extension ComplicationController { var descriptors : [CLKComplicationDescriptor] = [] var dataDict = Dictionary<AnyHashable, Any>() for station in data.stations { dataDict = [“name": station.name, “shortName": station.shortName] descriptors.append( CLKComplicationDescriptor( identifier: station.name, displayName: station.name, supportedFamilies: CLKComplicationFamily.allCases, userInfo: dataDict)) } descriptors.append( CLKComplicationDescriptor( identifier: "LogSighting", displayName: "Log Sighting", supportedFamilies: CLKComplicationFamily.allCases)) descriptors.append( CLKComplicationDescriptor( identifier: "SeasonData", displayName: "Season Data", supportedFamilies: [.graphicRectangular])) // Call the handler with the currently supported complication descriptors handler(descriptors) }
-
17:09 - CLKComplicationDataSource - Sample Templates
func getLocalizableSampleTemplate( for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) { let template = createSampleTemplate(forComplication: complication) handler(template) }
-
17:33 - Whale Watch - Entries
func createTimelineEntry( forComplication complication: CLKComplication, date: Date) -> CLKComplicationTimelineEntry? { guard let template = createTemplate(forComplication: complication, date: date) else { return nil } return CLKComplicationTimelineEntry(date: date, complicationTemplate: template) }
-
17:44 - Whale Watch - Templates
func createTemplate( forComplication complication: CLKComplication, date: Date) -> CLKComplicationTemplate? { var station: Station? = nil if let stationName = complication.userInfo?["name"] as? String { station = data.stations.first(where: { $0.name == stationName }) } let image = UIImage(named: "Spout-small")! let spoutFullColorImageProvider = CLKFullColorImageProvider(fullColorImage: image) let logSightingTextProvider = CLKSimpleTextProvider( text: "Log Sighting", shortText: "Log") let defaultTemplate: (CLKComplicationFamily) -> CLKComplicationTemplate = { family -> CLKComplicationTemplate in // Return a default complication template for the given family } switch (complication.family, complication.identifier) { case (.graphicRectangular, "SeasonData"): return CLKComplicationTemplateGraphicRectangularFullView( ChartView( seriesData: data.last7DaysSightings, seriesColor: .turquoise) case (.graphicCircular, "LogSighting"): return CLKComplicationTemplateGraphicCircularStackImage( line1ImageProvider: spoutFullColorImageProvider, line2TextProvider: logSightingTextProvider) case (.graphicCircular, _): guard let station = station else { return defaultTemplate(.graphicCircular) } return CLKComplicationTemplateGraphicCircularView( SightingTypeView(station: station)) case (.graphicCorner, _): guard let station = station else { return defaultTemplate(.graphicCorner) } return CLKComplicationTemplateGraphicCornerTextImage( textProvider: station.timeAndShortLocTextProvider, imageProvider: station.whaleActivityFullColorProvider) case (.graphicExtraLarge, _): guard let station = station else { return defaultTemplate(.graphicExtraLarge) } return CLKComplicationTemplateGraphicExtraLargeCircularStackText( line1TextProvider: station.timeAndLocationTextProvider, line2TextProvider: station.shortLocationTextProvider) default: return defaultTemplate(complication.family) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。