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.1 + 资产目录 + 存档 = AppIcon 无效图像路径
XCode images.assets 资产目录切片被忽略,图像仍然失真