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