私のアプリは数年間正常に動作していますが、iOS 6 のリリースでいくつか問題が発生しており、そのうちの 1 つは StatusBar の向きの問題です。
私のアプリはどちらの横向きでも動作しますが、2 つの向きのいずれかでステータス バーの幅だけタッチが垂直方向にずれていました。直観的には、回転中にステータス バーの画像が適切に再配置されたにもかかわらず、ステータス バーの論理的な位置が変更されず、画面の反対側でのタッチが消費されているように見えました。
私のInfo.plistファイルでは、「UIStatusBarHidden」がFALSEに設定されていました。アプリ デリゲートの "didFinishLaunchingWithOptions" 関数で、独自のカスタム ViewController を作成し、それをウィンドウの RootViewController として設定しました。これは iOS 6 より前では機能していましたが、この時点で StatusBar が新しい RootViewController に「転送」されていないと思います。
iOS 6 より前は、向きの変更が OLD RootViewController に伝達され、向きが期待どおりに機能したため、コードが機能したと理論付けました。iOS 6 は NEW RootViewController を超えて向きを伝達しなくなったため、OLD コントローラー (「論理的に」StatusBar を含んでいた) は更新されませんでした。
注: 私のアプリには .XIB ファイルがなく、この時点まで明示的に RootViewController を作成しません。しかし、とにかく、デフォルトのものは舞台裏で私のために作成されたと思います.
私の「解決策」は、Info.plist ファイルで「UIStatusBarHidden」を TRUE に設定し、カスタム RootViewController を設定した後で、コードで手動で FALSE に設定することでした。これは機能しているように見えますが、実際の問題ではなく、症状に対処した可能性があります。
StatusBar 以外の他のものは、その古い/暗黙の RootViewController に論理的に結び付けられている可能性があり、それらも新しいものに「転送」されていないため、副作用についても心配しています。
StatusBar や RootViewController で同様の経験をした人はいますか? このアプローチは問題ありませんか、それともデフォルト/暗黙の RootViewController をそのままにして、何らかの形で ViewController を子として追加する必要がありますか? 2 年前に最初にコードを書いたときはうまくいかなかったようで、それが現在の実装につながっています。
以下は、質問のコードのハイライトです。アドバイスをいただきありがとうございます。
-BT
// ******** Info.plist value *********
<key>UIStatusBarHidden</key>
<true/>
// ******** App Delegate **********
- (BOOL)application : (UIApplication *)application didFinishLaunchingWithOptions : (NSDictionary *)launchOptions
{
CGRect rect = [[UIScreen mainScreen] applicationFrame];
rect.origin.x = 0; rect.origin.y = 0;
self.window = [[[UIWindow alloc] initWithFrame:rect] autorelease];
self.gameViewController = [[[GameViewController alloc]init] autorelease];
self.gameView = [[[GameView alloc] initWithFrame:rect] autorelease];
[self.gameViewController.view addSubview : self.gameView];
[self.window setRootViewController:self.gameViewController];
// Setting it now attaches it to our actual RootViewController instead of the
// "phantom" controller created under the hood?
[UIApplication sharedApplication].statusBarHidden = NO;
// ...
}