45

因此,我使用最新版本的 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;
    }
}
4

6 回答 6

107

显然,iOS依赖于 iPhone 5+ 分辨率的启动图像的存在,以便让应用程序以该分辨率运行。

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

1.使用资产目录

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

2.挖出一些旧文件

如果您已经使用 XCode 一段时间,您就会知道在 XCode 4.x 的更高版本之一中,该应用程序自动为您的应用程序创建了三个默认启动图像文件,分别称为Default.pngDefault@2x.pngDefault-568h@2x.png. 您需要在您的应用程序中使用这些文件,它们本质上只是分别具有 、 和 分辨率的黑色图像480x320960x6401136x640注意,这些文件是 HxW,而不是 WxH)。

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

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

于 2014-02-10T03:34:03.773 回答
4

iOS will often "pretend" what screen size you have. Apple assumes for example that if you don't have the right launch image for some resolution, then you haven't designed your app to work properly in that resolution, so it will run your app in a different size. In an extreme case, an iPhone only app running on an iPad will return 320 x 480.

As far as your application is concerned, the screen size reported is the screen size available to your application. If it reports 320 x 480 then that is what your application can use. Anything drawn below 480 pixels will not be visible.

You convince iOS to run your app in the resolution that you want for example by supplying a launch image in the right size. In the case of iPhone 6 and 6+, the user can run them in "Zoom" mode so they behave as if they had the screen of an iPhone 5 or 6 (just physically bigger).

于 2016-03-03T10:58:57.093 回答
1

在 XCode6 中没有 iPhone5 屏幕大小的初始屏幕图像将触发警告。如果您按下警告,XCode 将添加一个默认值(纯黑色)。

这将启用“正常”模拟器大小。

于 2014-10-10T12:41:12.447 回答
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>

我希望,它会有所帮助!

于 2020-03-04T13:52:06.373 回答
0

在 iOS 8 [[UIScreen mainScreen] bounds].size.height);中,无论设备处于垂直模式还是横向模式,都会返回一些倒置的东西。

于 2014-10-10T12:45:37.997 回答
0

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

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

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

我为我正在做的一个项目制作了全套,这些都发布在 github 上,这样你就可以省去我制作所有这些图像的乐趣。

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

于 2020-05-12T23:31:52.313 回答