iOS - AppExtensions Today の概要
前提としてToday ウィジェットは以下のように動作することを期待しています。
簡潔に、きびきびと動作することを期待される上、成約も多いので合理的なUI設計が求められますし、対話的に操作する要素は最小限に留める必要があります。特に iOS の場合は、キーボード入力はできないという特徴があります。
また、Today のウィジェット内でスクロール要素をもたせるのは困難です。なぜなら Today ウィジェット自体がスクロールする仕様のため、個別のウィジェット内でスクロールするのはユーザーフレンドリーではないためです。
UI を設計する
ビューのレイアウトには AutoLayout を使用しましょう。Today ビューが占める面積は限られており、着目する情報を迅速に表示する必要があるので、必要以上に大きなウィジェットは避けましょう。 ビューの幅に合わせる必要がありますが、高さは表示内容に応じて調整できます。
内容を更新する
Today の拡張ポイントには、ウィジェットの状態を管理して、内容を更新するためのAPIが用意されています。
ウィジェットが常に最新の状態であることが期待されているので、システムは随時、ビューのスナップショットを取得しようとします。ウィジェットが一旦消えて、再び可視化状態になると、直近のスナップショットを一旦表示した上で、最新のビューに置き換わるように動作します。
スナップショットの取得前にウィジェットの内容を確認するにはNCWidgetProviding
プロトコルに従い、処理します。ウィジェットのwidgetPerformUpdateWithComletionHandler:
が呼び出されたら、ビューを最新の内容に更新して、完了ハンドラを呼び出すことで、状態を管理します。
完了ハンドラ、次のいずれかの定数を渡します。
NCUpdateResultNewData
: 内容が入れ替わったのでビューの再描画の必要があるNCUpdateResultNoData
: 内容が同じなので更新は不要NCUpdateResultFailed
: 更新処理中にエラーが起きた