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

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

为啥屏幕旋转 180 度不算作配置更改?

c++:使用全局鼠标钩子重新定位窗口

在设备旋转时重新定位 UIPopoverController

iPad和iPhone的方向:当我单击第二个视图并旋转然后切换回第一个视图时,我的控件没有重新定位

索引处的 Swift 方法 insertSubview 效果很好。但是如何重新定位所有子视图为插入的子视图腾出空间