[Apple Watch アプリ開発] #4 タイマーラベル
WKInterfaceTimer
概要
WKInterfaceTimerは、カウントダウン(アップ)タイマー用のカスタムラベルです。 現在より未来の日時を設定すればカウントダウン、過去の日時を設定もしくは日時を設定しない場合はカウントアップタイマーとなるようです。 WKInterfaceDateと同様に時間の情報はプログラムで制御しなくても自動で更新されます。 タイマーが 0 になったことを検知するためにはNSTimerを使用することが推奨されています。
特性
タイマーラベルは以下の特性を持ちます。
- 指定した時刻までのカウントダウンまたはカウントアップを行う
- 様々なフォーマットでカウント値のの表示を構成することができる
- プログラムで更新する必要はない
また、Apple はタイマーラベルを使用するときは以下のことを推奨しています。
- 正確なカウントダウンタイマーまたはカウントアップタイマーを実装するときに使用してください
作ってみる
いつもどおり画面の真ん中にタイマーラベルを配置します。
実行画面
フォーマットと表示項目
タイマーのフォーマットは5 種類、表示項目は7 つ存在します。
フォーマット
表示項目
ではフォーマットに関して、表示項目を7つ全て表示し、日時を半年後に設定した場合の表示を見てみましょう。
Positional
こちらがデフォルトのフォーマットです。 全ての項目が表示されています。
Abbreviated
こちらでは表示する必要のないところ(ここでは「年」)が省略されるようになっています。
Short
こちらは一見 Abbreviated と変わらないように見えますが、数字の後ろにスペースが追加されています。 謎の気遣いですね。
Full
こちらは Short と変わりありません。 英語環境だと変化があるようです。
Spelled Out
こちらは数値が一切使用されなくなります。 和風なアプリにマッチしそうですね。
WKInterfaceTimer の定義
WKInterfaceTimer は以下のように定義されています。
@availability(iOS, introduced=8.2) class WKInterfaceTimer : WKInterfaceObject { func setTextColor(color: UIColor?) func setDate(date: NSDate) // count up/down from current date to this date func start() func stop() }
タイマーラベルに日時を設定するときはsetDateメソッドを使用します。 タイマーの開始にはstartメソッド、停止にはstopメソッドを使用します。 stopメソッドを実行しても目標とする日時は変わらないので、一時停止などを実現したい場合は自分で工夫してプログラムを組む必要がありそうです。 ラベルに対して設定できることは色の変更のみです。
以下はカウントダウンタイマーの実装例です。 日時は10 秒後に設定しています。 NSTimerを使用して、タイマーが 0 になったら "Fire!" というログを表示するようにしています。
@IBOutlet weak var timerLabel: WKInterfaceTimer! override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) let date = NSDate().dateByAddingTimeInterval(10) self.timerLabel.setDate(date) self.timerLabel.start() let timer = NSTimer.scheduledTimerWithTimeInterval(date.timeIntervalSinceNow, target: self, selector: "ignition:", userInfo: nil, repeats: false) } func ignition(timer: NSTimer) { println("Fire!") }
まとめ
WKInterfaceTimerはカウントダウン(アップ)タイマーを作成するために利用します。 タイマーが 0 になったことを検知するためにはNSTimerを併用します。 一時停止の機能は無いので、単純なタイマーを作成するときに利用するのが良さそうです。
インスタントラーメンの時間を計るアプリなどは、このクラスを利用して Apple Watch アプリをリリースすると良さそうですね。