Excite Smartphone Engineer's Blog

2013年 04月 05日

インフォメーションに便利な表示方法

スマートフォン推進室の渡辺です。

なにかまとまったデータをダウンロード中とか、ちょっとしたインフォメーションを表示したい時ありますよね?
そういった時には、一時的に入力を制限して一番最上位にViewを表示する手法をとります。

オープンソースには SVProgressHUD とか MBProgressHUD とか有名なものもありますが、表示が自分のアプリに合わないとかシンプルものを自分で作りたいという人のために、簡単に作り方を紹介します。




まず真っ先に思いつくのが、UIViewをScreenサイズで作ってaddSubviewするという方法。
これは単純なViewしか表示していないときには有効ですが、タブをつかっていたりナビゲーションを使っていたりするとちょっとややこしくなります。

次にAlertViewを乗っ取る方法。その方法は本ブログでも紹介してます。
(Interface BuilderでAlertViewに自由を)
これでもほぼOKですね。

そして今回紹介するのは、もっと簡単に最上位にViewを表示する方法です。
答えは簡単。
UIWindowを使うのです。

通常のアプリケーションはUIWindowを一つ作って表示されています。
アプリケーションはそのUIWindowの上にUIViewを形成して表示しているわけです。
(今ではもうプログラマが気にしなくとも自動的に作ってくれてます。イイ時代です。)
そしてアプリケーションの土台となっているUIWindow (keyWndow)とは別に、新たにUIWindowを作成することによって独立した表示が可能となるのです。

UIWindowを生成してまずやることは、UIWindowLevel (windowLevel プロパティ。Zオーダーみたいなものだと思ってもらえればよいです)の設定です。
これがキモとなります。
UIWindowLevelは下記の3種類の定義があります。

const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;



UIWindowLevelNormal

通常と同レベルの位置にWindowを表示します。
通常のアプリケーションのWindowと同じなのでUIAlertViewが表示された場合は、作ったWindowはUIAlertViewより下になります。

UIWindowLevelAlert

UIAlertViewをと同レベルですが、UIAlertViewを表示するとWindowの方が上になります。
windowLevel = UIWindowLevelAlert - 1.0f;
とすればUIAlertViewよりwindowの方がレベルが下になるので、UIAlertViewが上に表示されるようになります。

UIWindowLevelStatusBar

UIStatusBarと同レベルです。ステータスバーの上に表示することができます。
すでにUIStatusBarが表示されている状態でwindowを表示すると、windowが上に表示されます。
UIWindowLevelAlertの時と同様に、windowLevel = UIWindowLevelStatusBar - 1.0f; でステータスバーより下に表示されるようになります。

よほどのことが無ければ、アラートも考慮しつつ通常のWindowよりも手前に表示できる UIWindowLevelNormal + 1.0f でよいでしょう。

注意点


UIWindowは回転しない。

縦・横表示に対応させる場合には、その上に載せるViewを自分で回転させる必要があります。

UIWindow上のViewは自分で後始末する。

windowを消去するときは、その上に載せたViewを自分でremoveFromSuperviewする必要があります。

あまり頻繁に使うものでもありませんが覚えておくと便利なので、「UIWindowを使うと便利」と頭の片隅にでも入れておきましょう。

サンプル的なものを作成したのでいろいろいじってみてください。
UIWindowSample

by sp_tech | 2013-04-05 18:40 | iOS | Comments(0)


<< [Android]Gmailみ...      UIActivityViewC... >>