アラートなどを表示するときにモーダルレイヤを出すことはよくあると思います。このモーダルレイヤを出す時に苦労するのがモーダルレイヤの下にあるボタンなどを押せなくする必要があることです。

例えば、HelloWorld のサンプルアプリは右下にあるボタンを押すとアプリが終了します。

モーダルレイヤ表示前

モーダルレイヤ表示前の状態



この画面に何も考えずにモーダルレイヤを配置しても、右下のボタンは押せてしまいます。(モーダルレイヤに表示している画像が右下のボタンに被っていても押せます。)
モーダルレイヤを表示

モーダルレイヤを表示。右上のボタンで閉じる。


モーダルレイヤでタッチイベントを取得するようにしてタッチを拾っても、右下のボタンは押せてしまいます。理由はレイヤのタッチイベント処理よりもボタンのイベント処理の優先度が高いためです。

そこで、モーダルレイヤ表示中は、CCTouchDispacher の優先度をモーダルレイヤが一番高くなるようにし、モーダルレイヤを閉じる際に、その設定を戻すようにします。そしてモーダルレイヤの ccTouchBegan で無条件に true を返すようにすることにより、タッチイベントを全て拾うようにして、モーダルレイヤ以下のタッチを禁止します。

注意点は CCTouchDispacher を戻すのをデストラクタでやろうとするとメモリリークします。(this を CCTouchDispacher に登録しているため参照カウンタがゼロにならない)モーダルを閉じる処理の中で必ずやるようにしてください。

こうしておけば、モーダルレイヤ以下のレイヤでは何もしなくも、モーダルレイヤを表示するだけでモーダル以下のレイヤへの操作を禁止できます。

モーダルレイヤを表示する ModalLayer クラスのソースです。

関連する投稿