我发现了一个奇怪的行为,并想解释一下我所做的断言是错误的。
在新创建的 WindowBased 项目的 AppDelegate 类中,我将 UIViewController 添加到窗口。
我可以通过两种不同的方式做到这一点:
- 使用 IBOutlet。在 IB 中,我只是实例化了一个 UIViewController,将其类设置为 TestViewController 并连接它(代码的场景 A)。
- 使用代码创建 UIViewController(场景 B)。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
#define USE_IBOUTLET YES // Comment this line to switch to scenario B
#ifdef USE_IBOUTLET
// Scenario A
[window addSubview:theTestViewController.view];
[window makeKeyAndVisible];
#endif
#ifndef USE_IBOUTLET
// Scenario B
TestViewController *theTestViewControllerProgrammatically;
theTestViewControllerProgrammatically = [[TestViewController alloc] initWithNibName:nil bundle:nil];
// According to Apple: "It is a good idea to set the view's frame before adding it to a window.", so let's do it
[theTestViewControllerProgrammatically.view setFrame:[[UIScreen mainScreen] applicationFrame]];
[window addSubview:theTestViewControllerProgrammatically.view];
[window makeKeyAndVisible];
#endif
}
由于我没有在 IB 中对对象进行任何自定义,因此在这两种情况下我应该具有相同的行为。
方案 A,使用 IBOutlet 按预期工作。
但是场景 B 存在以下问题:
- 视图不在正确的位置(高 20 像素,并且被状态栏覆盖)。
- 视图没有正确调整大小(例如,尝试切换通话状态栏)
为什么?
如果您想重现问题,请在此处压缩项目存档:http: //dl.dropbox.com/u/1899122/code/ProtoWindowBasedStrangeness.zip