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

问题的缘由

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

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

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

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

如下是重点(解决方法)

咱们都知道,pathForResource加载图片的速度要远比imageNamed:快,并且不会缓存到内存中,对于使用次数很少的图片使用pathForResource方法要比imageNamed:在效率和内存上都占优点,固然若是某张图片会使用不少次的话仍是使用imageNamed:比较好。spa

下面就对图片使用次数很少的状况进行分析,根据上面第3点,若是咱们既要使用倍图,又想使用pathForResource加载图片,那应该怎么办呢??废话很少说,上代码(附上机型适配的代码,须要用到):code

机型适配代码orm

//
//  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 */

复制代码

加载图片的方法:cdn

//使用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倍图基本上用不到了) blog

iOS机型适配

看到这相信不少小伙伴们都已经明白实现的原理了吧,是否是很简单啊!第一篇掘金,写的可能不是很好,若是能帮助到你就是对我最好的鼓励,有不明白或有异议的地方也能够随时和我反应!图片

相关文章
相关标签/搜索