美文网首页
iOS的pathForResource加载图片返回为nil及屏幕

iOS的pathForResource加载图片返回为nil及屏幕

作者: 大灰狼ios | 来源:发表于2019-02-15 17:48 被阅读0次

相信很多初入iOS的小伙伴们在使用pathForResource方法时都会遇到返回为nil的情况。我也是,前段时间就遇到了这个问题。为了搞清楚就稍微研究了一下这个方法,以下就是我的研究心得。

  • 我们最容易出现的问题,就是在导入资源图的时候没有点addTarget,只是拷贝到了项目中,并不属于项目,因此pathForResource也就获取不到图片,返回结果就为nil。我上次就是这个问题,导入的时候不注意,然后怎么找都感觉没问题。

  • 放到Images.xcassets中的图片(文件)不能使用pathForResource获取,是获取不到的,只能使用[UIImage imageNamed:]方法获取图片。

  • pathForResource加载倍图后面要加上@2x,@3x,不加只找1倍图。原因是这个方法会根据你提供的name和type进行准确查找,不能像imageNamed:方法那样会自适应倍图。

以下是重点

我们都知道,pathForResource加载图片的速度要远比imageNamed:快,而且不会缓存到内存中,对于使用次数不多的图片使用pathForResource方法要比imageNamed:在效率和内存上都占优势,当然如果某张图片会使用很多次的话还是使用imageNamed:比较好。

下面就对图片使用次数不多的情况进行分析,根据上面第3点,如果我们既要使用倍图,又想使用pathForResource加载图片,那应该怎么办呢??废话不多说,上代码(附上机型适配的代码,需要用到):

机型适配代码

//
//  AdaptiveDefine.h
//  iOS机型适配测试
//
//  Created by chy on 2018/12/20.
//  Copyright © 2019年 chy. All rights reserved.
//

#ifndef AdaptiveDefine_h
#define AdaptiveDefine_h


//状态栏高度
#define Height_StatusBar ((is_iPhoneXs == YES || is_iPhoneXr == YES || is_iPhoneXsMax == YES) ? 44.0 : 20.0)
//导航栏高度
#define Height_NavBar ((is_iPhoneXs == YES || is_iPhoneXr == YES || is_iPhoneXsMax == YES) ? 88.0 : 64.0)
//tabBar高度
#define Height_TabBar ((is_iPhoneXs == YES || is_iPhoneXr == YES || is_iPhoneXsMax == YES) ? 83.0 : 49.0)

//判断iPhone5系列       5,5s
#define is_iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreen mainScreen] currentMode].size) : NO)
//判断iPhone6系列       6,7,8,6s
#define is_iPhone6 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(750, 1334), [[UIScreen mainScreen] currentMode].size) : NO)
//判断iphone6+系列      6plus,7plus,8plus,6splus
#define is_iPhone6Plus ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2208), [[UIScreen mainScreen] currentMode].size) : NO)
//判断iPHoneXr        Xr
#define is_iPhoneXr ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(828, 1792), [[UIScreen mainScreen] currentMode].size) : NO)
//判断iPhoneX系列       X,Xs
#define is_iPhoneXs ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
//判断iPhoneXs Max     Xs Max
#define is_iPhoneXsMax ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO)

#endif /* AdaptiveDefine_h */

加载图片的方法:

//使用imageWithContentOfFile找PNG类型的图片
#define UIImageFilePNG(fileName) [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%@", fileName, (is_iPhone5 || is_iPhone6 || is_iPhoneXr) ? @"@2x" : @"@3x"] ofType:@"png"]]
//加载其他资源时
#define UISourceFile(fileName, fileType) [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:fileName ofType:fileType]]

附上iOS机型分辨率及使用倍图(1倍图基本上用不到了)


ios机型分辨率.JPG

看到这相信很多小伙伴们都已经明白实现的原理了吧,是不是很简单啊!第一篇简书,写的可能不是很好,如果能帮助到你就是对我最好的鼓励,有不明白或有异议的地方也可以随时和我反应,共同学习共同进步,加油!

相关文章

网友评论

      本文标题:iOS的pathForResource加载图片返回为nil及屏幕

      本文链接:https://www.haomeiwen.com/subject/nlymeqtx.html