メニュー画面がシンプルになり、アイコンが表示されてわかりやすくなった。
また、QuickViewが追加され、近いイベントがウォッチフェイスに表示されるようになった。
ところがこれが曲者で、自作のWatchFaceは、ちょうどQuickViewにすっぽり隠れる位置に
情報を集約させているため、時計が見えなくなってしまうのだ。
時計が見えず、次の予定までの時間のみが見える時計、というのも、悪くはないかもしれないが困る。
一応、設定からQuickViewを無効にすれば今までどおりに使えるのだが、
せっかくのスマートウォッチな機能を無効にするのもアレである。
ので、QuickViewが表示されるときは、単にWatchFace全体を上にずらすことにした。単純明快である。
しかし、Pebble公式SDKの解説がわかりづらくて困った。自分の読解力がないだけかもしれない。
ようは簡単な話で、
今まで、
GRect bounds = layer_get_bounds(window_layer);
で得ていた全画面の描画領域を、
GRect bounds = layer_get_unobstructed_bounds(window_layer);
に置き換えて、座標指定を相対化してあれば勝手にずれる、という話なのだが、
自作のWatchFaceはそれではうまくいかない。
結局、描画オブジェクトを1枚のレイヤーに集約し、
GRect QVbounds = layer_get_unobstructed_bounds(window_layer);
layer_set_bounds(all_layer, GRect(0, QVbounds.size.h +(0-168), QVbounds.size.w, 168));
で移動。
しかしこれでは、表示中にQuickViewが現れた場合に対応しないので、
//unobstructedハンドラ
static void prv_unobstructed_will_change(GRect final_unobstructed_screen_area,
void *context) {
GRect bounds = final_unobstructed_screen_area;
layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}
//unobstructedハンドラ
static void prv_unobstructed_did_change() {
Layer *window_layer = window_get_root_layer(s_main_window);
GRect bounds = layer_get_unobstructed_bounds(window_layer);
layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}
を追加。
static void main_window_load(Window *window)
に
//画面領域サービス(Quickview)に登録する
UnobstructedAreaHandlers handlers = {
.will_change = prv_unobstructed_will_change,
.did_change = prv_unobstructed_did_change
};
unobstructed_area_service_subscribe(handlers, NULL);
を追加。
でなんとかなった。
詳細は後でサンプルを上げようと思う。