UIScreen MainScreen Bounds返回错误的大小

时间:2014-02-10 03:13:16

标签: ios iphone objective-c frame uiscreen

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

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

这返回480,这是旧iPhone系列的屏幕尺寸。我在模拟器中试过,发生了同样的事情。我必须在项目中启用一些属性才能识别屏幕尺寸吗?

这仅适用于5个以上的设备;如果我在iPad上运行游戏,它会识别1024个屏幕大小。

我知道这个代码过去曾有用过。我使用完全相同的方法做了一段时间的游戏,它没有检测屏幕大小的问题,但这是在XCode 4.x中构建的。

其他信息:

我正在使用自定义视图控制器,我在App Delegate中创建了以下代码:

- (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 个答案:

答案 0 :(得分:102)

显然,iOS依赖完全来解决iPhone 5+的分辨率,以便让应用以该分辨率运行。

这个问题有两种解决方案:

<强> 1。使用资产目录

当您创建一个新项目时,会有一个名为资产目录的东西,它存储您的启动图像文件。将其中一个添加到您的项目和presto!

<强> 2。挖出一些旧文件

如果你已经在XCode上呆了一段时间,你就会知道在XCode 4.x的更高版本之一中,该应用会自动为你的应用创建三个默认的启动图像文件Default.pngDefault@2x.pngDefault-568h@2x.png。您需要在应用中使用这些文件,这些文件基本上只是分别为480x320960x6401136x640的黑色图片(请注意,这些是HxW,而不是WxH)。 / p>

  1. 将这些文件添加到“支持文件”组
  2. 转到项目属性,然后从“启动图像”部分
  3. 中选择“不使用资产目录”
  4. 删除资产目录。

  5. 希望这可以帮助遇到这个荒谬问题的其他人。

答案 1 :(得分:2)

iOS通常会“假装”您拥有的屏幕尺寸。例如Apple假设如果您没有正确的启动图像以获得某种分辨率,那么您没有将应用程序设计为在该分辨率下正常工作,因此它将以不同的大小运行您的应用程序。在极端情况下,在iPad上运行的仅限iPhone的应用程序将返回320 x 480.

就您的应用而言,报告的屏幕大小是您的应用程序可用的屏幕大小。如果它报告320 x 480,那么这就是您的应用程序可以使用的。在480像素以下绘制的任何内容都不可见。

您可以通过提供正确尺寸的启动图像来说服iOS以您想要的分辨率运行您的应用。对于iPhone 6和6+,用户可以在“缩放”模式下运行它们,因此它们的行为就像是拥有iPhone 5或6的屏幕(只是物理上更大)。

答案 2 :(得分:1)

在没有闪屏画面的XCode6中,iPhone5的屏幕尺寸会触发警告。如果按下警告,XCode将添加默认值(仅为纯黑色)。

这将使正常&#39;模拟器大小。

答案 3 :(得分:1)

在iOS 8 [[UIScreen mainScreen] bounds].size.height);中,无论设备处于垂直模式还是横向模式,都会返回反转的内容。

答案 4 :(得分: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>

我希望,这会有所帮助!

答案 5 :(得分:0)

这仍然取决于2014年发布的答案中所述的启动图像。

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

从XCode 10.3开始,执行此操作的方法是在项目中创建启动映像资产目录,然后在其中填充映像。具体来说,所有可能的选项都有27个不同大小的启动图像。

我为正在从事的项目制作了全套照片,这些照片都发布在github上,以便您可以节省自己制作所有这些图像的乐趣。

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