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機型適配

看到這相信不少小夥伴們都已經明白實現的原理了吧,是否是很簡單啊!第一篇掘金,寫的可能不是很好,若是能幫助到你就是對我最好的鼓勵,有不明白或有異議的地方也能夠隨時和我反應!圖片

相關文章
相關標籤/搜索