UIImage
- 继承自NSObject
UIImage加载
- imageNamed
1. 使用场合:图片比较小、使用频率较高
2. 建议把需要缓存的图片直接放到Images.xcassets(后改名Assets.xcassets)
3. 缓存清除交由系统管理,清除时间不确定
UIImage *image = [UIImage imageNamed:@"图片名"];
- imageWithContentsOfFile(推荐)
1. 使用场合:图片比较大、使用频率较小
2. 不需要缓存的图片不能放在Images.xcassets(后改名Assets.xcassets)
3. 缓存清除交由程序员管理,图片没再被强指针指向时图片缓存立即清除NSString *file = [[NSBundle mainBundle] pathForResource:@"图片名" ofType:@"图片的扩展名"]; UIImage *image = [UIImage imageWithContentsOfFile:@"图片文件的全路径"];
注意:放在Images.xcassets(后改名Assets.xcassets)里面的图片,只能通过图片名去加载图片,这是因为在app中,会将这里的文件压缩,无法取得图片地址
-
imageWithData
1. 使用场合:网络下载小图片[UIImage imageWithData:data];
-
imageWithCGImage
1. 使用场合:加载绘制的图片[UIImage imageWithCGImage:image.CGImage];
-
加载注意
-
控制台可能会输出以下警告信息
- 警告的原因: [UIImage imageNamed:nil]
CUICatalog: Invalid asset name supplied: (null) CUICatalog: Invalid asset name supplied: (null)
- 警告的原因: [UIImage imageNamed:@""]
CUICatalog: Invalid asset name supplied: CUICatalog: Invalid asset name supplied:
- 解决方案:
- 对图片名进行判断再加载
if (imageName.length) { }
- 对图片名进行判断再加载
-
图片拉伸
- iOS5之前
// 只拉伸中间的1x1区域 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
- iOS5开始
//默认是平铺模式 -(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets; //比上面方法多了伸缩方式(包括平铺和拉伸) -(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
图片渲染
- 有些图片显示出来会自动渲染成蓝色,比如
- iOS7之后,设置tabBarItem的选中图片
vc.tabBarItem.selectedImage = image;
- 设置UIButtonTypeSystem样式按钮的image时
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
[btn setImage:image forState:UIControlStateNormal];
-
解决方案
- 方案一:再产生一张不会进行渲染的图片
// 加载图片 UIImage *tempImage = [UIImage imageNamed:@"tabBar_essence_click_icon"]; // 产生一张不会进行自动渲染的图片 UIImage *selectedImage = [tempImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal]; vc.tabBarItem.selectedImage = selectedImage;
-
方案二:直接在xcassets文件中配置