起動画面を表示した直後にもう1枚画像を表示したい場合

例えば、企業ロゴを表示した後、アプリのロゴ画像を出したいって処理を実装したい場合。

メインのビューにstatusBarを表示しないんであれば、一番最初に表示されるUIViewControllerのViewDidLoadあたりにそういう処理を書いてしまえばいいんだけど、アプリ内でステータスバーを表示したい場合はなんとなく処理がややこしそうだと想像。

なので適当な対応策として、アプリ起動にUIWindowにUIImageViewを追加し、AppDelegate.m内で処理をしてあげれば一番最初に表示されるUIViewControllerに影響がでないんではないかと思ったので、以下のようなプログラムを書いてみました。

今回の場合、1枚目の起動画面をDefault.png、2枚目の起動ファイルをDefault2.pngと指定します。
アプリの起動時にはDefault.pngが表示されるように設定しておきます。


ヘッダファイル側(.h)

@interface hogehogeAppDelegate : NSObject <UIApplicationDelegate> {
    UIImageView *firstSplashView_;      // 起動画面1枚目(Default.png)
    UIImageView *secondSplashView_;     // 起動画面2枚目(Default2.png)
}

プログラム側(.m)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Default" ofType:@"png"];
    UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];
    firstSplashView_ = [[UIImageView alloc] initWithImage:img];
    [img release];

    [self.window addSubview:firstSplashView_];
    [self.window makeKeyAndVisible];
    
    [self performSelector:@selector(dispSecondSplashView) withObject:nil afterDelay:2.0f];
    return YES;
}

// 画像2枚目を表示
- (void)dispSecondSplashView {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0f];
    firstSplashView_.alpha = 0.0f;
    [UIView commitAnimations];
    
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Default2" ofType:@"png"];
    UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];
    secondSplashView_ = [[UIImageView alloc] initWithImage:img];
    [img release];
    
    [self.window insertSubview:secondSplashView_ belowSubview:firstSplashView_];
    [self performSelector:@selector(dispMainView) withObject:nil afterDelay:2.5f];
}

// メイン画面表示
- (void)dispMainView {
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0f];
    secondSplashView_.alpha = 0.0f;
    [UIView commitAnimations];
    
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:YES];
    [self.window insertSubview:self.viewController.view belowSubview:secondSplashView_];
    [self performSelector:@selector(removeSplashView) withObject:nil afterDelay:1.1f];
}

// 起動画面系削除
- (void)removeSplashView {
    [firstSplashView_ removeFromSuperview];
    firstSplashView_ = nil;
    [secondSplashView_ removeFromSuperview];    
    secondSplashView_ = nil;
}

ただ、このままだと起動画面が3枚、4枚と増えるようになってくるとそのぶんメソッドが増えてしまいますね。
ループでまわすような処理を作ってやる方がいいのかな・・・。