iOS 中只用3x图片解决方案(附源码)

随着Apple推出了6plus,图片资源成了一大问题,2x-640×960 2x-750×1334 3x-1242×2208,各种规格的图片,安装包必然增大了不少,那么多种类的图片难免会漏掉一些,所以自己写了一个UIImage的Category库,只需要在Bundle中添加3x的图片即可实现6plus使用3x图片,,6及以下版本使用2x图片。

话不多说,详情见代码和使用方式

(如果有问题请直接回复,歇歇)

//// UIImage+Compress.h// ImageCompress//// Created by Hunk on 15/3/3.// Copyright (c) 2015年 Hunk. All rights reserved.//// 图片压缩,bundle中只需要存在@3x.png的图片,@2x.png的图片会根据需要自动生成到Sandbox中#import <UIKit/UIKit.h>/* 使用方式 * * logo_huodong:bundle中后缀为@3x.png的图片名字,使用时无需加入任何后缀,直接传入名字即可 * imageWithName : 为UIImage的Category方法 * * UIImage *image = [UIImage imageWithName:@"logo_huodong"]; * UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.bounds) – image.size.width) / 2.0, 50.0, image.size.width, image.size.height)]; * [imageView setImage:image]; * [self.view addSubview:imageView];*/@interface UIImage (Compress)/** * Get image with image name * * @param name : Image name. A image named "logo@3x.png", inputing "logo" is necessary. * * @return UIImage */+ (UIImage *)imageWithName:(NSString *)name;@end//// UIImage+Compress.m// ImageCompress//// Created by Hunk on 15/3/3.// Copyright (c) 2015年 Hunk. All rights reserved.//#import "UIImage+Compress.h"#define BASE_IMG_WIDTH (1242)#define BASE_IMG_HEIGHT (2208)#define SUFFIX_3X_PNG @"@3x.png"#define SUFFIX_2X_PNG @"@2x.png"@implementation UIImage (Compress)// 获取图片+ (UIImage *)imageWithName:(NSString *)name{if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){return [UIImage imageNamed:name];}else{NSAssert(NO == [name hasSuffix:SUFFIX_3X_PNG], @"File name suffix @3x.png is unnecessary!");NSString *srcImgName = [name stringByAppendingString:SUFFIX_3X_PNG];NSString *desImgName = [UIImage desImageName:[UIImage getImageName:name] withExt:SUFFIX_2X_PNG];// PathNSString *cacheDir = [NSHomeDirectory() stringByAppendingPathComponent:@"/Library/Caches/Resources/images/"];// 判断存放图片的文件夹是否存在,不存在则创建对应文件夹NSFileManager *fileManager = [NSFileManager defaultManager];BOOL isDir = NO;BOOL isDirExist = [fileManager fileExistsAtPath:cacheDir isDirectory:&isDir];if(!(isDirExist && isDir)){NSError *error = nil;BOOL bCreateDir = [fileManager createDirectoryAtPath:cacheDir withIntermediateDirectories:YES attributes:nil error:&error];if(!bCreateDir){NSLog(@"Create Directory Failed! : %@", error.description);return nil;}}NSString *desPath = [cacheDir stringByAppendingPathComponent:desImgName];UIImage *desImage = [UIImage imageWithContentsOfFile:desPath];if(!desImage){// 如果从Cache中没有取到图片if([UIImage compressImage:srcImgName compressionQuality:0.8 desPath:desPath]){// 压缩成功desImage = [UIImage imageWithContentsOfFile:desPath];}else{desImage = nil;}}return desImage;}}// 压缩图片+ (BOOL)compressImage:(NSString *)name compressionQuality:(CGFloat)compressionQuality desPath:(NSString *)desPath{if(name == nil || desPath == nil){return NO;}UIImage *srcImage = [UIImage imageNamed:name];if(srcImage == nil){return NO;}// 根据屏幕尺寸设置图片尺寸UIScreen *mainScreen = [UIScreen mainScreen];// Default is Portrait or PortraitUpsideDownCGSize baseImgSize = CGSizeMake(BASE_IMG_WIDTH, BASE_IMG_HEIGHT);UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;if(orientation == UIDeviceOrientationLandscapeLeft || orientation == UIDeviceOrientationLandscapeRight){// LandscapeLeft or LandscapeRightbaseImgSize = CGSizeMake(BASE_IMG_HEIGHT, BASE_IMG_WIDTH);}CGSize newSize = CGSizeMake(srcImage.size.width * srcImage.scale * (CGRectGetWidth(mainScreen.bounds) * mainScreen.scale) / baseImgSize.width, srcImage.size.height * srcImage.scale * (CGRectGetHeight(mainScreen.bounds) * mainScreen.scale) / baseImgSize.height);// Reset imageUIImage *newImage = [UIImage imageWithImage:srcImage scaleToSize:newSize];// 对图片进行压缩NSData *imageData = UIImageJPEGRepresentation(newImage, compressionQuality);// 保存新图片return [imageData writeToFile:desPath atomically:YES];}// 重设图片的全名(带扩展名)+ (NSString *)desImageName:(NSString *)srcImageName withExt:(NSString *)extName{return [srcImageName stringByAppendingString:extName];}// 获取图片的名字(不带扩展名)+ (NSString *)getImageName:(NSString *)srcImage{if(srcImage){NSArray *tempArray = [srcImage componentsSeparatedByString:@"."];if(tempArray){// 有.分割的文件名if([tempArray count] > 1){NSString *extName = [tempArray lastObject];// 严格判断文件的扩展名if([extName isEqualToString:@"png"] || [extName isEqualToString:@"jpg"] || [extName isEqualToString:@"jpeg"]){return [srcImage substringWithRange:NSMakeRange(0, srcImage.length – (extName.length + 1))];}else{return nil;}}else{return srcImage;}}else{return srcImage;}}return nil;}// 对图片尺寸进行重新设置+ (UIImage *)imageWithImage:(UIImage*)image scaleToSize:(CGSize)newSize{UIGraphicsBeginImageContext(newSize);[image drawInRect:CGRectMake(0.0, 0.0, newSize.width, newSize.height)];UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return newImage;}@end

旁观者的姓名永远爬不到比赛的计分板上。

iOS 中只用3x图片解决方案(附源码)

相关文章:

你感兴趣的文章:

标签云: