頭と尻尾はくれてやる!

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


ステータスバー(?)分のスペースができるんだけど

20px分の謎のスペース

よくこの問題で悩まされるんだよな。
上の画像のように、意味不明なスペースができるんだ。高さが20pxだし、ステータスバーを表示しない場合だとならないから、どこかのviewControllerあたりかが「オラもステータスバーの分ずらさなきゃ!」ってやらなくていいことやっちゃってずれているのかな?

簡単なプロジェクトで不具合を再現していろいろいじってみたんだよ。
構成はこんな感じ。
AppDelegate
RootViewController : UIViewController
ViewController1 : UIViewController

今作っているアプリではRootViewControllerってUIViewControllerのサブクラスでいくつかのviewControllerを切り替えているんだ。
その名残でViewController1なんてクラス名にしてるけど、この簡単なプロジェクトでは別にViewController2なんてクラスはないよ。

各クラスで何やってるか上から簡単に説明していくと、一番最初はこんな感じ。
//in AppDelegate
RootViewController *rootViewController = [[RootViewController alloc] init];
self.window.rootViewController = rootViewController;
[rootViewController release];
↑AppDelegateのself.window.rootViewControllerにrootViewControllerを設定しているだけ。これよくやるよね?
あ、そうそう、今度のアプリはiOS 5.0以降をターゲットにしているんだけど、そのくせARCは使っていないんだ。まあ惰性ってやつだね。そのくせ記事内ではちゃんと解放していないかもしれないけど、そのあたりはスルーしてね。

次にRootViewController内の処理ね。
//in RootViewController
- (void)loadView
{
    [super loadView];

    ViewController1 *viewController1 = [[ViewController1 alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController1];
    [viewController1 release];
    [self.view addSubview:navigationController.view];
}
↑ここでViewController1クラスのオブジェクトを作っているよ。ただ、ナビゲーションバーを表示したいので、それに突っ込んでからnavigationController.viewをself.viewにaddしてるよ。
さっきも言ったけど、これだとnavigationControllerはリークしちゃうから注意してね。

ViewController1クラスではたいしたことやってないよ。
//in ViewController1
- (void)loadView
{
    [super loadView];

    self.title = @"ViewController1";
    self.view.backgroundColor = [UIColor grayColor];
}
↑ナビゲーションバーに表示されるタイトルと背景色を設定してるだけだね。

ともかく構成はこんな感じなんだけど、これだと最初の画像みたいに20pxの空間ができちゃうんだよ。

どうしたものかと思ってたんだけど、たまたま 'addChildViewController:' を使ったら回避できるのを見つけたんだよ。
この 'addChildViewController:' メソッド使ってる?iOS 5.0で追加されたんだよね、確か。
今までなかったんだからそれでもなんとかなるんだけど、いざ使ってみるとやっぱり便利だよね。

これを使うとRootViewControllerクラスではこんな感じに変わるんだ。
//in RootViewController
- (void)loadView
{
    [super loadView];

    ViewController1 *viewController1 = [[ViewController1 alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController1];
    [viewController1 release];
    [self addChildViewController:navigationController];//new
    [navigationController release];//new
    [self.view addSubview:navigationController.view];
}
↑newの二行が増えただけなんだけど、こうすると結果は次のようにあのスペースが消えるんだよね!

addChildViewController:で不具合解消

なぜか知らないけどさ。
やっぱりUIViewControllerクラスのオブジェクトを重ねる(addする)時は addChildViewController: できちんとしてやるといいんだねっ!さすがiOS 5で追加されたメソッドだけあるよ!

ってキレイに締めくくりたいところなんだけどさ。
実はこれナビゲーションバーを表示しない場合だと addChildViewController: を使ってもスペースができちゃうんだよね。だ、だめじゃないかあ、、、orz

<< 重すぎるだろ?iPad (3G)  TopPage  お父さんメモ帳 >>

コメント

きもちわるい

2013.11.06      編集


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

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/552-76a95c87




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

FC2Ad