开发中使用UIImageView是再常见不过的,而平时我们往往会对简单的东西重视不够,忽略一些细节,接下来就介绍一下自己遇到的一处有关UIImageView使用上的细节
场景一
直接在项目的Bundle路径中拖入图片素材(一张.jpg类型,一张.png类型)
然后在viewDidLoad中创建一个UIImageView来使用图片显示在界面上:
1.先使用.png类型的图片
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置图片 1:
// 直接使用项目bundle路径中图片资源(.png)
imageView.image = [UIImage imageNamed:@"MJ"];
}
图片显示在界面上:
2.使用.jpg类型的图片
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置图片 1: 直接使用项目bundle路径中图片资源(.png)
// imageView.image = [UIImage imageNamed:@"MJ"];
// 设置图片 2: 直接使用项目bundle路径中图片资源(.jpg)
imageView.image = [UIImage imageNamed:@"路飞"];
}
结果:
对比发现两段代码没有任何区别,只是图片类型不同,一张为.jpg,另一张为.png,资源路径都是直接放在了项目的bundle路径下
这时,我稍加改动一下,再来观察结果
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置图片 1: 直接使用项目bundle路径中图片资源(.png)
// imageView.image = [UIImage imageNamed:@"MJ"];
// 设置图片 2: 直接使用项目bundle路径中图片资源(.jpg)
imageView.image = [UIImage imageNamed:@"路飞.jpg"];
}
结果:
代码没有任何改动,只是将.jpg类型图片补充上后缀,图片就正常显示了
场景二
使用Assets.xcassets中的图片素材,同样先导入素材(一张.jpg类型,一张.png类型))
1.使用.png类型的图片
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置图片 1: 直接使用项目bundle路径中图片资源(.png)
// imageView.image = [UIImage imageNamed:@"MJ"];
// 设置图片 2: 直接使用项目bundle路径中图片资源(.jpg)
// imageView.image = [UIImage imageNamed:@"路飞.jpg"];
// 设置图片 3: 使用Assets.xasssets中的图片资源(.png)
imageView.image = [UIImage imageNamed:@"艾尼路"];
}
结果:
2.使用.jpg类型的图片
- (void)viewDidLoad {
[super viewDidLoad];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置图片 1: 直接使用项目bundle路径中图片资源(.png)
// imageView.image = [UIImage imageNamed:@"MJ"];
// 设置图片 2: 直接使用项目bundle路径中图片资源(.jpg) --> 需要补充后缀,否则图片不被显示
// imageView.image = [UIImage imageNamed:@"路飞.jpg"];
// 设置图片 3: 使用Assets.xasssets中的图片资源(.png)
// imageView.image = [UIImage imageNamed:@"艾尼路"];
// 设置图片 4: 使用Assets.xasssets中的图片资源(.jpg)
imageView.image = [UIImage imageNamed:@"佩恩"];
}
对比发现,如果图片资源放入了Assets.xcassets中,不需要添加图片后缀;
而如果图片资源直接在项目路径中,png可以不设置后缀,而.jpg类型是一定需要补充后缀才能正常显示的
顺便再来说明一下图片加载的方式,图片有两种加载方式
1.通过imageNamed:方式进行加载
无论是否有人使用,默认是将图片放入缓冲区,程序关闭时才会释放
- 这种方式的优点:加载速度会很快,数据加载一次后不需要重新加载
- 这种方式的缺点:内存占用高
2.通过imageWithContentsOfFile: 文件的方式加载
需要注意的是:
- 当把图片放入Assets.xcassets中,系统会把图片打包处理,那么久无法通过文件路径的方式来进行加载
- 当需要用UIImageView展现序列帧动画时,执行序列帧动画的图片不能放在Assets.xasssets中,需要放在项目的Bundle中