表示中のビューコントローラーを置き換える : Objective-C プログラミング

PROGRAM


表示中のビューコントローラーを置き換える

iPhone アプリで、表示中のビューを UINavigationController の pushViewController:animated: や UIViewController の presentModalViewController:animated: などで切り替えることはできます。

ただ、そのようなどこかのビューコントローラーから表示するような流れではなく、既存のビューコントローラーからそっくり新しいビューコントローラーに切り替える方法がないか調べてみました。

 

そうしたところ、どうやらキーウィンドウの rootViewController を置き換えることで、表示中の画面をまるごと別の画面に切り替えることができることがわかりました。

// アプリケーションのキーウィンドウを取得して、そのルートビューコントローラーを置き換えます。

[UIApplication sharedApplication].keyWindow.rootViewController = aViewController;

こうすることで、これまで表示されていたビューコントローラーが管理しているウィンドウから、新しく rootViewController に設定したビューコントローラーに、表示も含めて即座に切り替えることができました。

このとき、それまで rootViewController に設定されていたビューコントローラーは解放されます。

切り替え時に描画が見えてしまう場合

切り替えた新しいビューコントローラーで、たとえば viewDidAppear: で処理をしている場合など、ルートビューコントローラーを切り替えたときに、画面が整うまでの様子が一瞬見えてしまう場合があります。

このようなときには、キーウィンドウの rootViewController に代入する前に、次のようにしてキーウィンドウをいったん非表示にしてあげます。

// キーウィンドウを透明化します。

[UIApplication sharedApplication].keyWindow.alpha = 0.0;

非表示にするには、他にも hidden プロパティがありますが、これを YES に設定すると、rootViewController に新しいビューコントローラーを代入しても、それが表示状態にならないため viewDidAppear: まで処理が進んでくれません。

 

 alpha を使ってキーウィンドウを非表示にして、ルートビューコントローラーを差し替えれば、ちゃんと viewDidAppear: まで処理が進んでくれます。

後は viewDidAppear: などの表示状態が整った後で再び、次のようにして透明化を解除してあげます。

// キーウィンドウの透明化を解除します。

[UIApplication sharedApplication].keyWindow.alpha = 1.0;

これで、描画途中が見られてしまうことはなくなります。

 

ただ、この方法だとキーウィンドウをいったん非表示にするため、まっくらな画面がちらついて見えるようになると思います。

それが目立つような場合には、UIView の beginAnimations:context: を使って alpha をフェードアウトさせて、綺麗に消えた後で置き換え、そして alpha をフェードインするみたいな方法をつかって、ちらつきを演出の中に組み込んでしまうなどの工夫は必要かもしれません。

[ もどる ]