【iPhone SDK】viewControllerのloadViewの使い方

UIViewControllerを使う時、画面表示までに複数の関数が通過します。

init, loadView, viewDidLoad, viewWillAppear, viewDidAppear

initはallocした時に通例で書くから、変数の初期化などはここの中で書いても問題ないですね。んで、UIViewControllerにはそのビューを表示するためのUIViewを持っているわけですが、

このビューは自動で生成されるものだと認識してて、

このビューにaddSubViewする子のビューたちのサイズを決める際、

自分はCGRectGetWidth, CGRectGetHeightを使ってきました。



CGRectGetWidth( self.view.bounds );



とした場合、UIViewControllerのもつviewの幅を取得するわけですが、

viewDidLoadのタイミングで取得すると、縦持ち状態での幅が取得されます。



shouldAutorotateToInterfaceOrientationでランドスケープのみと定義してても

このタイミングではあくまでポートレートの幅で取得となります。



そのため、ランドスケープアプリを作成する際、viewWillAppearのタイミングで私は今までサブビューたちの設定をしてきました。

viewWillAppearは画面表示されるタイミングで飛んでくるので、

UINavigationControllerによる画面遷移でもどってきた場合や、モーダル表示から帰ってきた場合もコールされます。

そのときにまた初期化してしまわないよう、フラグを用意して回避するようにしてました。



でも、正直スマートじゃないよな〜っと思っていたところ、

そもそもこのUIViewControllerのviewっていつサイズがきまってるのだ?という疑問になり、調べました。

[ self.view addSubview ○○ ];
とかいて正常に処理ができるのはviewDidLoadのタイミングから
ということはこの時点ではviewは生成されているのですね。

loadViewのタイミングで調べると、viewはnilの状態でした。
ということはこのタイミングで生成されているのか…

普段この関数はオーバーライドしないようにコメントアウトされた状態で新規作成されているかと思います。
この関数をオーバーライドしてなにもしない関数にすると、
viewが生成されず、画面になにも表示されませんでした。

なのでloadViewをオーバーライドするとUIViewControllerのviewを自分好みのサイズで作ることができるということですね。

というわけでランドスケープのアプリの場合、
loadViewにて

self.view = [[[UIView alloc] initWithFrame: CGRectMake(0, 0, 480, 320)] autorelease];

と書くようにしました。
こうするとviewDidLoadのタイミングでも

CGRectGetWidth( self.view.bounds );
にて、横長サイズの幅を取得することができました。

う〜ん、普段つかっていない部分って知らないことがあるもんです。

次はviewDidUnloadについて書こうかと…



この記事へのコメント


この記事へのトラックバック