Xcode 5和资产目录:如何引用LaunchImage?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode 5和资产目录:如何引用LaunchImage?相关的知识,希望对你有一定的参考价值。

我正在使用Xcode 5的资产目录,我想使用我的LaunchImage作为我家视图的背景图像(这是一种非常常见的做法,可以从'加载'过渡到'加载'看起来很平滑)。

我想在资产目录中使用相同的条目来节省空间,而不必在两个不同的图像集中复制图像。

但是,致电:

UIImage *image = [UIImage imageNamed:@"LaunchImage"]; //returns nil
答案

这是LaunchImage的(几乎)完整列表(不包括没有状态栏的iPad图像):

  • launch image-568还@2小.PNG
  • launch image-700-568还@2小.PNG
  • launch image-700-landscape@2小~iPad.PNG
  • LaunchImage-700-景观〜ipad.png
  • launch image-700-portrait@2小~iPad.PNG
  • LaunchImage-700-肖像〜ipad.png
  • launch image-700@2小.PNG
  • launch image-landscape@2小~iPad.PNG
  • LaunchImage - 风景〜ipad.png
  • launch image-portrait@2小~iPad.PNG
  • LaunchImage画像〜ipad.png
  • LaunchImage.png
  • launch image@2小.PNG
  • LaunchImage-800-667h@2x.png(iPhone 6)
  • LaunchImage-800-Portrait-736h@3x.png(iPhone 6 Plus Portrait)
  • LaunchImage-800-Landscape-736h@3x.png(iPhone 6 Plus横向)
  • LaunchImage-1100-Portrait-2436h@3x.png(iPhone X Portrait)
  • LaunchImage-1100-Landscape-2436h@3x.png(iPhone X Landscape)
另一答案

documentation中有明确说明:

“资产目录中的每个集都有一个名称。您可以使用该名称以编程方式加载集合中包含的任何单个图像。要加载图像,请调用UIImage:ImageNamed:方法,传递包含图像的集合的名称“。

使用Pichirichi的列表有助于解决这种不一致。

另一答案

可以通过一行代码轻松访问Launch image。

 UIImage *myAppsLaunchImage = [UIImage launchImage];

请按照以下步骤操作,以实现上述功能。

步骤1.通过创建类别并向其添加以下方法来扩展UIImage类。

+ (UIImage *)launchImage {
    NSDictionary *dOfLaunchImage = [NSDictionary dictionaryWithObjectsAndKeys:
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,p", // ios 8 - iphone 5 - portrait
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,l", // ios 8 - iphone 5 - landscape
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,p", // ios 7 - iphone 5 - portrait
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,l", // ios 7 - iphone 5 - landscape
                                    @"LaunchImage-700-Landscape@2x~ipad.png",@"1024,768,2,7,l", // ios 7 - ipad retina - landscape
                                    @"LaunchImage-700-Landscape~ipad.png",@"1024,768,1,7,l", // ios 7 - ipad regular - landscape
                                    @"LaunchImage-700-Portrait@2x~ipad.png",@"1024,768,2,7,p", // ios 7 - ipad retina - portrait
                                    @"LaunchImage-700-Portrait~ipad.png",@"1024,768,1,7,p", // ios 7 - ipad regular - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,p", // ios 7 - iphone 4/4s retina - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,l", // ios 7 - iphone 4/4s retina - landscape
                                    @"LaunchImage-Landscape@2x~ipad.png",@"1024,768,2,8,l", // ios 8 - ipad retina - landscape
                                    @"LaunchImage-Landscape~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - landscape
                                    @"LaunchImage-Portrait@2x~ipad.png",@"1024,768,2,8,p", // ios 8 - ipad retina - portrait
                                    @"LaunchImage-Portrait~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - portrait
                                    @"LaunchImage.png",@"480,320,1,7,p", // ios 6 - iphone 3g/3gs - portrait
                                    @"LaunchImage.png",@"480,320,1,7,l", // ios 6 - iphone 3g/3gs - landscape
                                    @"LaunchImage@2x.png",@"480,320,2,8,p", // ios 6,7,8 - iphone 4/4s - portrait
                                    @"LaunchImage@2x.png",@"480,320,2,8,l", // ios 6,7,8 - iphone 4/4s - landscape
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,p", // ios 8 - iphone 6 - portrait
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,l", // ios 8 - iphone 6 - landscape
                                    @"LaunchImage-800-Portrait-736h@3x.png",@"736,414,3,8,p", // ios 8 - iphone 6 plus - portrait
                                    @"LaunchImage-800-Landscape-736h@3x.png",@"736,414,3,8,l", // ios 8 - iphone 6 plus - landscape
                                    nil];
    NSInteger width = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.width:[UIScreen mainScreen].bounds.size.height;
    NSInteger height = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.height:[UIScreen mainScreen].bounds.size.width;
    NSInteger os = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] integerValue];
    NSString *strOrientation = UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])?@"l":@"p";
    NSString *strImageName = [NSString stringWithFormat:@"%li,%li,%li,%li,%@",width,height,(NSInteger)[UIScreen mainScreen].scale,os,strOrientation];
    UIImage *imageToReturn = [UIImage imageNamed:[dOfLaunchImage valueForKey:strImageName]];
    if([strOrientation isEqualToString:@"l"] && [strImageName rangeOfString:@"Landscape"].length==0) {
        imageToReturn = [UIImage rotate:imageToReturn orientation:UIImageOrientationRight];
    }
    return imageToReturn;
}

步骤2.上述方法应该通过将以下代码添加到同一类别的UIImage中来工作

static inline double radians (double degrees) {return degrees * M_PI/180;}

+ (UIImage *)rotate:(UIImage*)src orientation:(UIImageOrientation) orientation {
    UIGraphicsBeginImageContext(src.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }
    [src drawAtPoint:CGPointMake(0, 0)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
另一答案

我意识到这对于每个人来说不一定是最好的解决方案,但最容易(并且最不容易出错,恕我直言)这样做的方法是在Images.xcassets目录中创建一个单独的条目。我叫它SplashImage

当您添加新条目时,请确保不要选择“新启动图像”作为选项。而是选择通用的“新图像集”。接下来,打开检查器并选择相关选项。如果您只为视网膜设备构建,就像我一样,您可以选择以下内容:

这将为您留下四个条目(iPhone 4S,iPhone 5(s,c),iPhone 6和iPhone 6 Plus)。

对应图像的文件如下:

| Resolution (Xcode entry) | Launch Image name   |   Device         |
|--------------------------|---------------------|------------------|
| 1x                       | Default-750.png     | iPhone 6         |
| 2x                       | Default@2x.png      | iPhone 4S        |
| Retina 4 2x              | Default-568h@2x.png | iPhone 5, 5s, 5c |
| 3x                       | Default-1242.png    | iPhone 6 Plus    |

当然,在你完成这个之后你可以简单地使用[UIImage imageNamed:@"SplashImage"]

另一答案

在Pichirichi的回答的帮助下,我实现了以下类别(iOS 7+):UIImage+AssetLaunchImage

它实际上只是动态生成名称,但可能会有所帮助。

另一答案

更新到最新的Swift语法(Swift 5)

   func splashImageForOrientation(orientation: UIInterfaceOrientation) -> String? {

    var viewSize = screenSize
    var viewOrientation = "Portrait"
    if orientation.isLandscape {
        viewSize = CGSize(width: viewSize.height, height: viewSize.width)
        viewOrientation = "Landscape"
    }
    if let infoDict = Bundle.main.infoDictionary, let launchImagesArray = infoDict["UILaunchImages"] as? [Any] {
        for launchImage in launchImagesArray {
            if let launchImage 

以上是关于Xcode 5和资产目录:如何引用LaunchImage?的主要内容,如果未能解决你的问题,请参考以下文章

在 XCode 5 中使用多个资产目录的问题

Xcode 5.1 + 资产目录 + 存档 = AppIcon 无效图像路径

资产目录在 Xcode 5 中是不是强制要求应用商店批准

XCode images.assets 资产目录切片被忽略,图像仍然失真

为啥 Xcode 5 从 Finder 拖入资产目录时拒绝识别我的图标?

如何将 JPEG 添加到 Xcode 中的资产目录?