這一篇主要是要紀錄如何設定 Apple Watch 的 Complication。

Complications 是錶面上可讓使用者選擇的小元件,需要使用 ClockKit 開發 (有些畫面可以用 SwiftUI 開發),它的用途是在特定的時間,顯示相對應的資訊。

Apple Watch 內建數十種錶面,每種錶面支援的 complications 數量 / 位置 / 尺寸都不盡相同,根據不同的尺寸跟風格,定義了多種不同的 families,每個 familiy 支援不同的 templates,我們使用 template 來設定要顯示的文字、圖片、或儀表圖。各種不同 families 的長相可以參考這份文件

一些限制

設計 complications 時有幾點要注意的:

  • 不支援動畫
  • 不支援任何互動,只會啟動 app
  • 圖片置中顯示且不會自動縮放
  • 根據使用者設定,用原色或單色調顯示

取得 Complication Timeline Entries 的順序

Complication 是在特定的時間,顯示相對應的資訊,watchOS 跟 CLKComplicationDataSource 取得需要的資訊,以下是它的順序:

  1. 呼叫 func getComplicationDescriptors(handler: @escaping ([CLKComplicationDescriptor]) -> Void) 取得所有可提供的 complication 種類,我們可以根據 family 還有自訂的 identifier 來設計 complication。
  2. 呼叫 func getTimelineEndDate(for complication: CLKComplication, withHandler handler: @escaping (Date?) -> Void) 得知是否能根據不同時間顯示不同 complication 內容。
  3. 呼叫 func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) 取得目前時間要顯示的 complication 內容。
  4. 呼叫 func getTimelineEntries(for complication: CLKComplication, after date: Date, limit: Int, withHandler handler: @escaping ([CLKComplicationTimelineEntry]?) -> Void) 取得未來時間要顯示的 complications 內容。

如何建立 Complication Timeline Entry

建立 Timeline Entry 的作法大致如下:

  1. 根據 Complication 的 familyidentifier 屬性,決定要使用哪種 templatedata provider
  2. 建立 data provider,然後建立 template
  3. 根據日期跟 template 建立 timeline entry

如何更新 Timeline Entries

除了被動等待系統來獲取 complication timeline entries 之外,還有下列幾種方式可以主動更新:

參考資料