以编程方式访问iPad启动图像?

4
我在Images.xcassets中使用LaunchImage.launchimage管理启动图像。但我也想在应用程序内部使用启动图像。
我阅读了这个答案:

文档说明UIImage上的imageNamed:方法应该会自动神奇地选择正确的版本。

所以,我使用了这段代码:
UIImageView *backImage = [UIImageView new];
backImage.image = [UIImage imageNamed:@"LaunchImage"];

在使用 iPhone 4、5、6 和 6+ 时,它能够正常工作并获取正确的启动图像,但是在 iPad retina 上工作时,它返回 LaunchImage-700@2x.png ,这是 iPhone 4s 的启动图像 640 x 960 像素

那么我该如何通过编程访问 iPad 的正确启动图像呢?

LaunchImage 文件夹中 Contents.json 的内容。

{
  "images" : [
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "736h",
      "filename" : "LaunchImage-800-Portrait-736h@3x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "3x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "667h",
      "filename" : "LaunchImage-800-667h@2x.png",
      "minimum-system-version" : "8.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "filename" : "LaunchImage-700@2x.png",
      "scale" : "2x"
    },
    {
      "extent" : "full-screen",
      "idiom" : "iphone",
      "subtype" : "retina4",
      "filename" : "LaunchImage-700-568h@2x.png",
      "minimum-system-version" : "7.0",
      "orientation" : "portrait",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "filename" : "LaunchImage-700-Portrait~ipad.png",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "filename" : "LaunchImage-700-Landscape~ipad.png",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "filename" : "LaunchImage-700-Portrait@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "minimum-system-version" : "7.0",
      "filename" : "LaunchImage-700-Landscape@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700.png",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700@2x.png",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "iphone",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700-568h@2x.png",
      "subtype" : "retina4",
      "scale" : "2x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700-Portrait~ipad.png",
      "scale" : "1x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700-Landscape~ipad.png",
      "scale" : "1x"
    },
    {
      "orientation" : "portrait",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700-Portrait@2x~ipad.png",
      "scale" : "2x"
    },
    {
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "filename" : "LaunchImage-700-Landscape@2x~ipad.png",
      "scale" : "2x"
    }
  ],
  "info" : {
    "version" : 1,
    "author" : "xcode"
  }
}
3个回答

2
我用一种冗长的方法解决了这个问题。
BOOL deviceIsIpad = NO;
if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad ) {
    deviceIsIpad = YES;
}

if (!deviceIsIpad) {
    backImage.image = [UIImage imageNamed:@"LaunchImage"];
} else {
    UIInterfaceOrientation interfaceOrientation = self.interfaceOrientation;
    CGFloat screenScale = [[UIScreen mainScreen] scale];
    if (interfaceOrientation == UIDeviceOrientationPortrait || interfaceOrientation == UIDeviceOrientationPortraitUpsideDown){
        if (screenScale > 1) {
            backImage.image = [UIImage imageNamed:@"LaunchImage-700-Portrait@2x~ipad.png"];
        } else {
            backImage.image = [UIImage imageNamed:@"LaunchImage-700-Portrait~ipad.png"];
        }
    } else {
        if (screenScale > 1) {
            backImage.image = [UIImage imageNamed:@"LaunchImage-700-Landscape@2x~ipad.png"];
        } else {
            backImage.image = [UIImage imageNamed:@"LaunchImage-700-Landscape~ipad.png"];
        }
    }
}

0

LaunchImage.launchimage

你真的在使用Images.xcassets来管理启动图片吗?难道不是使用LaunchImage.launchimage吗?

如果是这样,就会产生混淆。你不能从LaunchImage.launchimage中使用[UIImage imageNamed:@"LaunchImage"];进行加载。

规范名称

  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-700@2x.png
  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png

LaunchImage-700-Portrait@2x~ipad.png 不在列表中。


是的,我正在使用位于Images.xcassets中的LaunchImage.launchimage - MujtabaFR
1
即使将 LaunchImage-700-Portrait~ipad.png 重命名为 LaunchImage-700~ipad.png 并编辑 Contents.json,仍然返回 iPhone 4s 启动图像。 - MujtabaFR

0

我相信那些扩展名(例如-700-Landscape@2x~ipad)是不可识别的。

为了测试目的,将以下项目添加到您的Contents.json中:

{
      "orientation" : "landscape",
      "idiom" : "ipad",
      "extent" : "full-screen",
      "filename" : "LaunchImage.png",
      "scale" : "1x"
}

现在尝试使用imageNamed:方法。

或者尝试使用带有完整图片名称的imageNamed:方法:

backImage.image = [UIImage imageNamed:@"LaunchImage-700-Landscape~ipad.png"];

如果这没有解决你的问题,你需要获取Images.xcassets包。请确认。我将添加获取Images.xcassets包的代码。 - hasan
抱歉..即使将LaunchImage-700-Portrait~ipad.png重命名为LaunchImage.png并编辑了Contents.json,仍然没有改变,仍然返回iPhone 4s图像。 - MujtabaFR
但是,如果像这样使用完整的图像名称 [UIImage imageNamed:@"LaunchImage-700-Landscape~ipad.png"],它可以工作。但是,这需要更多的代码才能正常工作。 - MujtabaFR
我知道。这对我也从来没有起作用过。我相信苹果从未真正为所有这些扩展提供100%的支持。只有一些简单的扩展,如@2x才能工作。 - hasan

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