屏幕主屏幕边界返回错误的大小

46

我使用最新版本的XCode创建了一个新项目,并尝试记录我的应用程序的屏幕大小(以确定UI的设备类型)。我从我的iPhone 5运行以下代码:

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);

这返回了480,这是旧版iPhone系列的屏幕尺寸。我在模拟器中尝试了一下,发现同样的情况也出现了。我需要在项目中启用某些属性才能识别屏幕尺寸吗?

只有在5+设备上才会发生这种情况;如果我在iPad上运行游戏,它就可以识别1024的屏幕尺寸。

我知道这段代码过去是可行的。我以前制作过一个游戏,使用完全相同的方法,没有问题地检测到了屏幕尺寸,但那个游戏是在XCode 4.x中构建的。

附加信息:

我正在使用自定义视图控制器,在应用程序委托中使用以下代码创建:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    if([Global getDevice] == 1)
    {
        //iPhone 5+
        self.window.rootViewController = [[FivePlus alloc] initWithNibName:nil bundle:nil];

    }
    else if([Global getDevice] == 2)
    {
        //iPhone 4S-
        self.window.rootViewController = [[FourSMinus alloc] initWithNibName:nil bundle:nil];
    }
    else
    {
        //iPad
        self.window.rootViewController = [[iPad alloc] initWithNibName:nil bundle:nil];
    }

    [[self window] makeKeyAndVisible];

    // Override point for customization after application launch.
    return YES;
}

Global.h文件中的getDevice方法:

+ (int)getDevice
{
if([[UIScreen mainScreen] bounds].size.height == 568 || [[UIScreen mainScreen] bounds].size.width == 568)
    {
        return 1;
    }
    else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {
        return 3;
    }
    else
    {
        return 2;
    }
}
6个回答

107
显然,iOS仅仅依赖于在iPhone 5+分辨率下存在启动图像来让应用程序在该分辨率下运行。
有两种解决方法:
1. 使用资源目录
当您创建一个新项目时,会有一个称为资源目录的东西来存储您的启动图像文件。将其添加到您的项目中即可!
2. 找出一些旧文件
如果您已经使用XCode一段时间了,您会知道在XCode 4.x的后期版本中,应用程序会自动为您的应用程序创建三个默认的启动图像文件,分别称为Default.png、Default@2x.png和Default-568h@2x.png。您需要这些文件,它们本质上只是具有分辨率480x320、960x640和1136x640的黑色图像,分别是HxW(注意这些不是WxH)。
1. 将这些文件添加到“Supporting Files”组中 2. 转到项目属性并从启动图像部分选择“不使用资源目录” 3. 删除资源目录。
希望这能帮助遇到这个荒谬问题的其他人。

13
+1 +1 +1 +1 +1 +1 +1 +1 您不知道这有多有帮助。真是个奇怪的问题。哦天啊.................... - Katushai
请参见https://dev59.com/amAf5IYBdhLWcg3w52Pm - Bobjt
5
这个软件的特殊性质是一个牛仔程序员才会有的,而不是苹果公司。我非常想听听苹果公司的某个人解释为什么UIScreen类应该依赖于启动图像? - turingtested
2
这是苹果又一次令人难以置信的糟糕表现! - armnotstrong
1
疯了,你一定花了好几天时间做这个。 - buster
显示剩余2条评论

4
iOS经常会“假装”你的屏幕尺寸。例如,如果某个分辨率没有正确的启动图像,苹果会认为你没有为该分辨率设计应用程序,所以它会在不同的尺寸上运行你的应用程序。在极端情况下,仅支持iPhone的应用程序在iPad上运行时将返回320 x 480。
就你的应用程序而言,报告的屏幕尺寸是应用程序可用的屏幕尺寸。如果报告的是320 x 480,则应用程序可以使用该尺寸。任何低于480像素的绘制都不可见。
你可以通过提供正确大小的启动图像来说服iOS运行你想要的分辨率。在iPhone 6和6+的情况下,用户可以运行它们的“缩放”模式,使它们的行为就像具有iPhone 5或6的屏幕(只是更大)。

1
在XCode6中,如果没有为iPhone5屏幕大小设置启动画面,则会触发警告。如果您按下警告,XCode将添加一个默认的启动画面(只是纯黑色)。
这将启用“正常”的模拟器大小。

1
我在打开一个旧项目时遇到了这个问题。所以,我找到了解决方案。在我的情况下,问题是我没有LaunchScreen文件和info.plist文件中的相关信息。
  1. 右键点击您的info.plist -> 打开方式 -> 源代码
  2. <dict></dict>之间添加以下两行

    UILaunchStoryboardName LaunchScreen

如果需要,info.plist文件的主体如下:

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>$(DEVELOPMENT_LANGUAGE)</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
    </array>
    <key>UISupportedInterfaceOrientations~ipad</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationPortraitUpsideDown</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
</dict>
</plist>

我希望,它能帮到你!


0

这仍然依赖于2014年发布的答案中描述的启动图像。

自从那个答案发布以来,苹果已经发布了许多具有不同屏幕分辨率的产品,因此该答案中的解决方案#2不再适用于所有设备。

从XCode 10.3开始,做法是在项目中创建一个启动图像资源目录,然后填充它们。 具体而言,为所有可能的选项创建27个不同大小的启动图像。

我为我正在开发的项目制作了完整的一套,这些都发布在github上,这样您就可以节省制作所有这些图像的乐趣。

https://github.com/aeu/ios-launch-images


尽管启动图像不再使用,但屏幕大小仍然会遵循它们。 - aeu

0
在iOS 8中,[[UIScreen mainScreen] bounds].size.height);返回的结果会根据设备是处于垂直模式还是横向模式而有所不同。

1
请注意,我检查.height==568 || .width==568 - Liftoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接