UIWindow addSubview上的偏移量

tcu*_*rdt 26 iphone cocoa-touch

我有一个基于UITabBar的应用程序,工作正常.在某些情况下,我会显示不同的UIViewController.现在的问题是,我必须调整测试笔尖的框架(并且只有测试笔尖!)才能正确显示.(否则视图位于状态栏下方).

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    if (condition) {

        UIViewController *vc = [[UIViewController alloc] initWithNibName:@"Test" bundle:nil];

        // FIXME this should NOT be required
        CGRect r = vc.view.frame;
        r.origin.y += 20;
        vc.view.frame = r;

        [window addSubview:vc.view];
        [window makeKeyAndVisible];
        return;
    }

    [window addSubview:tabViewController.view];
    [window makeKeyAndVisible];
}
Run Code Online (Sandbox Code Playgroud)

那么测试笔尖可能有问题吗?不能.测试笔尖在一个干净的新项目中按照需要工作.一个新的干净笔尖显示相同的症状.所以MainWindow笔尖必定有问题,对吧?但是UITabBarController显示得很好.

我有点困惑,这里没有想法.有什么建议如何跟踪这个?

cdu*_*uhn 76

将根视图添加到UIWindow可能很复杂,因为窗口始终是状态栏的下层.因此,必须重置根视图的框架[[UIScreen mainScreen] applicationFrame]以防止它也会覆盖状态栏.我们通常不必担心这个,因为UIViewController会为我们修改框架...除非它没有.这是交易:

  • 如果在同一个NIB中创建视图控制器及其视图,并将视图嵌套在视图控制器下,它将自动调整视图的框架.
  • 如果在同一个NIB中创建视图控制器及其视图,但是通过控制器的视图插口将视图连接到视图控制器而不是嵌套它,控制器将不会自动调整视图的框架.
  • 如果你在一个NIB创建视图控制器,并且将其连接到由IB设置视图控制器的"NIB名称"属性中的一种超然的NIB定义的视图,它自动调整视图的框架,但只有当你也有"从NIB调整视图"已选中.
  • 如果通过调用-initWithNibName:bundle:来创建视图控制器,它将不会自动调整视图的框架.
  • UITabBarController期望将其视图添加为窗口的根视图,因此始终调整其自己的视图框架以自动匹配应用程序框架.(因此,如果您将UITabBarController的视图添加为窗口以外的任何子视图,您会注意到一个奇怪的20像素间隙.)

我猜Apple认为-initWithNibName:bundle:通常不会用于创建窗口的根视图,所以它不会在你的情况下调整框架.正如您所做的那样手动调整大小是很好的,事实上在iPhone OSView Controller编程指南中推荐使用它,但是您应该使用它,[[UIScreen mainScreen] applicationFrame]因为状态栏并不总是 20像素高(例如,当您打开时它会更高)一个电话.)