为什么窗口的子视图最初定位不正确,但在旋转后正确重新定位?

时间:2011-09-07 01:57:31

标签: ios cocoa-touch ipad

考虑以下app delegate入口点:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    // Custom view controller
    main = [[MainView alloc] initWithNibName:@"MainView" bundle:nil];
    [self.window addSubview:main.view];

    return YES;
}

除“自定义视图控制器”部分外,一切都是Apple股票代码。在那里,抓取了一个自定义视图控制器,并有效地添加为应用程序的主视图。

问题:视图中的小部件比它们应该的位置高出20px。换句话说,视图内容的前20px被状态栏遮挡。

但是:旋转后,视图及其内容正确定位,状态栏重叠不再出现。

这里发生了什么?具体而言,在最初将子视图添加到窗口时,确保事物正确定位的模式/最佳实践是什么?

2 个答案:

答案 0 :(得分:4)

您使用错误的方法初始化UIWindow的框架。 Yous应该使用[[UIScreen mainScreen] applicationFrame],因为你正在谈论的原因。 Read this了解更多信息(基本上applicationFrame负责处理状态栏问题)。

答案 1 :(得分:1)

我认为既然您已经使用initWithFrame:[[UIScreen mainScreen] bounds]来初始化框架(height-480)然后添加了一个子视图,那么当应用程序启动时,它会占用整个屏幕(因为您已经要求它)。但是当你旋转它时,框架会根据状态栏调整大小。这就是为什么问题只发生一次,即第一次。看看这个问题:UIViewAutoresizingNone: Resize after rotation

为了确保在最初将子视图添加到窗口时也能正确定位事物,您可以在将其添加为frame之前定义其origin尺寸和subView