一.需求說明
當(dāng)一個APP用戶量大的時候,就需要給不同的用戶做標簽,用來彰顯身份.比如QQ的會員,VIP等不同的皮膚功能.
二.實現(xiàn)方法.
- 所謂不同的皮膚,就是不同的權(quán)限(身份)顯示不同的本地或者網(wǎng)絡(luò)圖片.為了給圖片做區(qū)別.就需要不同的命名方式. 比如普通身份(status_normal),vip身份(status_vip). 也就是說在基礎(chǔ)的圖片名后面加上身份標記.
皮膚.png
- 需要寫一個UIImage的Category. 需要處理的是:將系統(tǒng)的
imageNamed
方法替換成自己的方法MC_imageNamed
.在這方法里面進行身份/權(quán)限的判斷.拼接不同的圖片名稱.達到換膚的目的.
#import "UIImage+Helper.h"
#import <objc/runtime.h>
@implementation UIImage (Helper)
+ (void)load {
// 防止子類調(diào)用super導(dǎo)致多次交換
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method imageNameddd = class_getClassMethod([UIImage class], @selector(imageNamed:));
Method MC_imageNamed = class_getClassMethod([UIImage class], @selector(MC_imageNamed:));
method_exchangeImplementations(imageNameddd, MC_imageNamed);
});
}
+ (nullable UIImage *)MC_imageNamed:(NSString *)name {
// 用戶的權(quán)限
NSInteger roleId = 1;
NSString * string;
UIImage * image;
// 生成image的方法一定要用自己寫的方法MC_imageNamed. 不能用imageNamed.會導(dǎo)致循環(huán)使用.
if (roleId == 0) {
image = [UIImage MC_imageNamed:name];
} else {
string = [NSString stringWithFormat:@"%@_vip",(NSString *)name];
image = [UIImage MC_imageNamed:string];
// 如果圖片不存在的處理
if (!image) {
image = [UIImage MC_imageNamed:name];
}
}
return image;
}
@end
- 使用.
正常的圖片賦值.imageView.image = [UIImage imageNamed:@"status"];
三.說明
1.需要導(dǎo)入<objc/runtime.h>
不導(dǎo)入會報錯
Declaration of 'Method' must be imported from module 'ObjectiveC.runtime' before it is required
Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態(tài)語言的優(yōu)勢在于:我們寫代碼時能夠更具靈活性,如我們可以把消息轉(zhuǎn)發(fā)給我們想要的對象亲善,或者隨意交換一個方法的實現(xiàn)等义图。這種特性意味著objective-c不僅需要一個編譯器撬槽,還需要一個運行時系統(tǒng)來執(zhí)行編譯的代碼檩帐。對于Objective-C來說,這個運行時系統(tǒng)就像一個操作系統(tǒng)一樣:它讓所有的工作可以正常的運行椅寺。這個運行時系統(tǒng)即Objc Runtime。Objc Runtime其實是一個Runtime庫蒋失,它基本上是用C和匯編寫的返帕,這個庫使得C語言有了面向?qū)ο蟮哪芰Αuntime的強大之處在于它能在運行時創(chuàng)建類和對象篙挽。
- Objective-C神奇方法 - load
load 方法會在加載類的時候就被調(diào)用荆萤,也就是 ios 應(yīng)用啟動的時候,就會加載所有的類铣卡,就會調(diào)用每個類的 + load 方法链韭。是在main函數(shù)之前執(zhí)行.