21

在横向模式下启动我的 iPad 应用程序时无法获得正确的边界。我在 Info.plist 文件中设置了正确的键,并且我的视图控制器在横向(和纵向,自然)中正确启动。

在我的applicationDidFinishLaunching:方法中,我在延迟 3 秒后调用选择器,并且该方法调用[[UIScreen mainScreen] applicationFrame],但它返回给我一个纵向框架(即高度 > 宽度)。

有谁知道如何解决这一问题?这对我来说闻起来像一个错误(如果是这样,我将提交雷达),但如果它是预期的行为,它在哪里记录?

4

8 回答 8

35

我从不依赖[[UIScreen mainScreen] applicationFrame],尤其是在应用程序启动期间。

在代码中创建视图时,使用超级视图来设置框架。

如果您使用带有“模拟界面元素”的 xib,它们的大小将正确,一切都会很好。

基于 UINavigationController 的应用程序

对于基于 UINavigationController 的应用程序,直接从 抓取框架self.navigationController.view,不要尝试使用[self loadView]and self.view.superview。UINavigationController 使用“隐藏的”子视图来完成它的工作——所以直接的超级视图将不起作用。

UINavigationController 很特别,因为在应用程序启动期间,导航控制器会在loadView被调用后调整视图的大小。当自动调整大小开始时,您最终会在屏幕底部有一个小边距。

为什么不 UIScreen

[[UIScreen mainScreen] applicationFrame]不能可靠地工作(尤其是在横向启动应用程序期间)。我的经验是视图控制器的interfaceOrientation属性与applicationFrame方向不匹配。

于 2010-10-29T13:45:18.637 回答
14
CGRect bounds = [[UIScreen mainScreen] bounds]; // portrait bounds
if (UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) {
    bounds.size = CGSizeMake(bounds.size.height, bounds.size.width);
}
于 2013-02-11T09:52:56.397 回答
6

当您以横向方式拿着 iPad 并启动应用程序时,视图控制器最初会看到纵向视图的边界(即使方向报告横向)。然后,视图控制器将收到一条消息,在它出现之前旋转到横向。

于 2010-04-19T20:59:09.583 回答
6

当视图控制器处于横向时,这是我获得正确 CGRect 的方式:

CGRect landscapeBounds;
if (self.view.frame.size.width < self.view.frame.size.height)
    landscapeBounds = CGRectMake(self.view.frame.origin.y, self.view.frame.origin.x, self.view.frame.size.height, self.view.frame.size.width);
else
    landscapeBounds = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
于 2012-01-31T23:50:42.783 回答
5

这是设计的。您应该查询您的超级视图的大小并根据需要进行调整。

于 2010-04-19T04:22:38.907 回答
2

[[UIScreen mainScreen] applicationFrame]即使应用程序处于横向模式,也将始终返回纵向矩形。UIWindow 这与从不实际旋转,而只是改变变换的事实有关rootViewController.view

为了确保,您可以在纵向和横向模式下打印根视图对象,您将看到如下内容:

肖像:

<UIView: 0x96290e0; frame = (0 20; 768 1004); ...

景观:

<UIView: 0x96290e0; frame = (0 20; 768 1004); transform = [0, 1, -1, 0, 0, 0]; ...
于 2013-06-15T21:13:45.707 回答
1

因此,根据 Apple 的指南,添加一个启动图像并为其赋予后缀 -568h。

我不明白为什么有头脑的人会让系统设置依赖于图形;但我刚刚测试过,它奏效了。

这是快速搜索后教我的地方,我没有在上面看到这个答案,认为它对某人有用。

小号

于 2013-06-15T20:20:16.953 回答
0

在 Cordova 插件中使用 dismissViewControllerAnimated 关闭视图时遇到了同样的问题。我修改了 MainViewController 中 viewWillAppear 方法的singingAtom 代码,在关闭模式视图后调整了它的大小:

- (void)viewWillAppear:(BOOL)animated
    {
    CGRect appFrame = [[UIScreen mainScreen] applicationFrame];
    UIDeviceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    if (UIDeviceOrientationLandscapeLeft == orientation || 
        UIDeviceOrientationLandscapeRight == orientation)
            {
            if (appFrame.size.width < appFrame.size.height)
                {
                appFrame = CGRectMake(appFrame.origin.y, appFrame.origin.x, appFrame.size.height, appFrame.size.width);
                }
        }
    self.view.frame = appFrame;
    [super viewWillAppear:animated];
}
于 2012-10-11T07:55:08.247 回答