给既存的WatchOS Extension添加Complication

  1. 1. 前言
  2. 2. 添加方法
  3. 3. 后记

前言

写下这个标题的时候我也是比较懵逼的,Complication到底中文叫什么的?日文叫什么呢?我也不知道。
众所周知,apple Watch的表盘上有着显示各种信息的小模块,这些模块的统称就是Complication。
从0创建Compliation并不难,在创建WatchOS Extension的时候,直接勾选同时创建Complication,然后勾选需要支持的Complication的模块类型就行了。
那么,问题是,当我们写好了整个Extenstion,才想到需要添加一个Complication作为表盘上的快捷方式,那该如何是好呢?

添加方法

首先在WatchOS的Extension下面创建一个新的Class,实现NSObject, CLKComplicationDataSource两个协议。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import UIKit
import ClockKit

class ComplicationController: NSObject, CLKComplicationDataSource {

func getSupportedTimeTravelDirections(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimeTravelDirections) -> Void) {
handler([.forward, .backward])
}
func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
//todo
}
func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
//todo
}
}

接下来,我们要在WatchOS Extension中添加使用Complication的申明和配置。

1
2
3
4
5
6
<key>CLKComplicationPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).ComplicationController</string>
<key>CLKComplicationSupportedFamilies</key>
<array>
<string>CLKComplicationFamilyGraphicCircular</string>
</array>

这里的CLKComplicationFamilyGraphicCircular是可以选择的Complication模块的一种。WatchOS提供了十几种可供选择的模块来实现。
具体查看文档即可。

最后就是要实现CLKComplicationDataSource协议的方法。

1
2
3
4
5
6
7
8
func getLocalizableSampleTemplate(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTemplate?) -> Void) {
let template = CLKComplicationTemplateGraphicCircularImage()
let image = UIImage(named: "modular_image")

template.imageProvider = CLKFullColorImageProvider(fullColorImage: image!)

handler(template)
}

这个方法实现的是,当我们自定义表盘,选择到这个Extension的时候,显示的内容。这里是一张名为modular_image的图片。

1
2
3
4
5
6
7
8
9
10
func getCurrentTimelineEntry(for complication: CLKComplication, withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void) {
let template = CLKComplicationTemplateGraphicCircularImage()
let image = UIImage(named: "modular_image")

template.imageProvider = CLKFullColorImageProvider(fullColorImage: image!)
let entry = CLKComplicationTimelineEntry.init(date: Date(), complicationTemplate: template)

handler(entry)

}

同样,这个方法实现的是我们抬起表,手表亮起来的时候,在表盘上该Extension所需要显示的内容,这里我们不具体实现根据时刻变化显示不同内容,仅仅作为一个快捷方式,我们可是和上面一样,显示一张图片。

后记

上面的总结是在编写Gopro的手表遥控器的时候遇到的一些问题。
作为一个非IOS的程序员,通过查阅资料翻阅文档来解决自己的疑惑,再加之Xcode强大的补完和提示功能,其实使用Swift编写IOS程序也并不是什么难事。

如果你觉得本文对你有帮助,请给我点赞助。