为啥窗口的子视图最初定位不正确,但旋转后重新定位正确?
Posted
技术标签:
【中文标题】为啥窗口的子视图最初定位不正确,但旋转后重新定位正确?【英文标题】:Why is a window’s subview initially positioned incorrectly, but repositioned correctly after rotation?为什么窗口的子视图最初定位不正确,但旋转后重新定位正确? 【发布时间】:2011-09-07 01:57:30 【问题描述】:考虑以下应用委托入口点:
- (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 股票代码。在那里,一个自定义视图控制器被抓取,并有效地添加为应用程序的主视图。
问题:视图中的小部件比它们应该在的位置高 20 像素。换句话说,视图内容的顶部 20px 被状态栏遮挡。
但是:旋转后,视图及其内容定位正确,不再出现状态栏重叠。
这里发生了什么?具体来说,在最初将子视图添加到窗口时,确保事物定位正确的模式/最佳实践是什么?
【问题讨论】:
【参考方案1】:您在初始化 UIWindow 的框架时使用了错误的方法。您应该使用[[UIScreen mainScreen] applicationFrame]
正是您所说的原因。 Read this 更多(基本上applicationFrame
负责状态栏问题)。
【讨论】:
这并不完全正确,但它引导我到了正确的地方。旋转后更改 self.window 坐标给了我更多错误,但我通过添加以下内容修复了所有问题:main.view.frame = [[UIScreen mainScreen] applicationFrame];
【参考方案2】:
我认为由于您使用initWithFrame:[[UIScreen mainScreen] bounds]
初始化框架(高度-480)然后添加了一个子视图,因此当应用程序启动时,它会占用整个屏幕(正如您所要求的那样)。但是当你旋转它时,框架会根据状态栏调整大小。这就是为什么问题只出现一次,即第一次。看看这个软问题:UIViewAutoresizingNone: Resize after rotation。
为确保在最初将子视图添加到窗口时也正确定位,您可以在将其添加为 subView
之前定义其 frame
大小和 origin
。
【讨论】:
以上是关于为啥窗口的子视图最初定位不正确,但旋转后重新定位正确?的主要内容,如果未能解决你的问题,请参考以下文章
辅助监视器上的视图定位不正确,主监视器上的 MainWindow
在设备旋转时重新定位 UIPopoverController