我的应用已经运行了好几年了,但是随着 iOS 6 的发布出现了一些问题,其中之一是 StatusBar 方向的问题。
我的应用程序可以在任一横向方向上工作,但在两个方向之一中,触摸垂直偏离状态栏的宽度。直观地说,即使状态栏图像在旋转过程中被正确地重新定位,状态栏的逻辑位置也没有改变——因此会消耗屏幕错误一侧的触摸。
在我的 Info.plist 文件中,“UIStatusBarHidden”设置为 FALSE。在我的 App Delegate 的“didFinishLaunchingWithOptions”函数中,我创建了自己的自定义 ViewController 并将其设置为 Window 的 RootViewController。尽管这在 iOS 6 之前有效,但我相信此时状态栏没有“转移”到新的 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 添加到它作为一个孩子?两年前我第一次编写代码时,这似乎不起作用,这导致了我目前的实现。
以下是问题中代码的亮点。提前感谢您的建议。
-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;
// ...
}