UIImageView设置图片的注意点

开发中使用UIImageView是再常见不过的,而平时我们往往会对简单的东西重视不够,忽略一些细节,接下来就介绍一下自己遇到的一处有关UIImageView使用上的细节

场景一

直接在项目的Bundle路径中拖入图片素材(一张.jpg类型,一张.png类型)

bundle下.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"];
    
}

图片显示在界面上:

bundle_png.png

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:@"路飞"];
}

结果:


bundle_jpg.png

对比发现两段代码没有任何区别,只是图片类型不同,一张为.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"];
}

结果:

bundle_jpg加上后缀.png

代码没有任何改动,只是将.jpg类型图片补充上后缀,图片就正常显示了

场景二

使用Assets.xcassets中的图片素材,同样先导入素材(一张.jpg类型,一张.png类型))

Assets.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:@"艾尼路"];
    
}

结果:

Assets_png.png

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_jpg.png

对比发现,如果图片资源放入了Assets.xcassets中,不需要添加图片后缀;
而如果图片资源直接在项目路径中,png可以不设置后缀,而.jpg类型是一定需要补充后缀才能正常显示的

顺便再来说明一下图片加载的方式,图片有两种加载方式
1.通过imageNamed:方式进行加载

无论是否有人使用,默认是将图片放入缓冲区,程序关闭时才会释放
- 这种方式的优点:加载速度会很快,数据加载一次后不需要重新加载
- 这种方式的缺点:内存占用高

2.通过imageWithContentsOfFile: 文件的方式加载

需要注意的是:
- 当把图片放入Assets.xcassets中,系统会把图片打包处理,那么久无法通过文件路径的方式来进行加载
- 当需要用UIImageView展现序列帧动画时,执行序列帧动画的图片不能放在Assets.xasssets中,需要放在项目的Bundle中
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,982评论 25 708
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,141评论 5 13
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,551评论 6 30
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • 每一个孩子都会有”坏”脾气。教育专家认为,当孩子有了”坏”脾气时,父母首先应当理解,采取适应的方法,这样才能使孩子...
    美窝购阅读 536评论 0 49