頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


ステータスバーの上層にビューを表示させたい

頭と尻尾はくれてやる! UIButtonのタップと長押しを検出する
↑この続きね。UIButtonの長押しは検出できた、と。
次に長押ししている間にステータスバーに何かを表示する部分の処理。

これを実装しようとしたんだけど、、、一癖も二癖もあるね。
簡単にステータスバーへの参照を引っ張ってきてそこへaddSubview:すりゃいい、なんて思ってたんだけどそんな簡単なもんじゃなかったよ。

まずは基本的なとこから行ってみる。

どうやらUIWindowオブジェクトを作らなければいけないみたいなんだ。こんな感じで。
{
    UIWindow *window = [[UIWindow alloc] init];
    window.windowLevel = UIWindowLevelStatusBar;
    [window makeKeyAndVisible];
}
どこかにaddSubview:するとかじゃなくて最後のmakeKeyAndVisibleメソッドで表示される。frameプロパティやバックグラウンドなんかを指定すれば簡単にチェックできるよ。
windowLevelプロパティにどんな値を設定するのが適正かはよくわからなかった。UIWindowLevelStatusBar+1なんてしてるのもあったしなあ。iOSのバージョンがアップして不具合を発生すれば要確認ってところかな。
UIWindowクラスはUIViewのサブクラスなので、自分が表示したいUIViewオブジェクトなどをここに乗せればOK。

ステータスバーの上にビューを表示
↑こんな感じで表示できる。ナビゲーションバーのボタンを長押しした場合に表示されてる、というイメージだよ。

ところで、UIWindowオブジェクトなんて普段あまり関わらないよね。
せいぜいAppDelegateのapplication:didFinishLaunchingWithOptions:にまいどー!って出てくるだけじゃない? ああ、このwindowにのっけりゃ表示されるんだな、くらいの理解だったんだ。
改めてリファレンスを見てみるとアプリは通常このwindowを一つしか持てないんだってさ。いや、複数のwindowを作ることはできるんだけど処理してくれるが一つだけみたいで、開発者がどのwindowを有効にするか指定する必要があるんだ。
最初このmakeKeyAndVisibleメソッドを使ったらそれまで使えていたタブなんかが効かなくなって焦ったんだけど、そういうことなんだよね。

有効なwindowをkey windowと呼ぶらしいけど、それじゃそのkey windowを元のに戻すのはこんな感じ。
{
    [[UIApplication sharedApplication].keyWindow makeKeyAndVisible];
}
UIApplicationクラスに文字通りkeyWindowなんてプロパティがあってそこから通常のアプリのwindowオブジェクトにアクセスできる。

なお、一度作ったUIWindowオブジェクト自体を破棄したら自動的に元のkeyWindowに戻るけど、なんとなくはっきり指定した方が気分がいいよね。


これだけわかったらボタン長押しでステータスバーにヒントを表示するビューを表示/非表示させることはできるはず。
ただ、iPad対応や画面の回転にも対応できるようになど汎用性を持たせようとするとかなりめんどくさいんだよね。

<< CGPointもカテゴリで配列へ   TopPage  構造体の定義部分にカテゴリで拡張しておく >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/765-8b50d9de




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad