考虑以下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被状态栏遮挡。
但是:旋转后,视图及其内容正确定位,状态栏重叠不再出现。
这里发生了什么?具体而言,在最初将子视图添加到窗口时,确保事物正确定位的模式/最佳实践是什么?
答案 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
。