APP換膚

一.需求說明

當一個APP用戶量大的時候,就須要給不一樣的用戶作標籤,用來彰顯身份.好比QQ的會員,VIP等不一樣的皮膚功能.git

二.實現方法.

  1. 所謂不一樣的皮膚,就是不一樣的權限(身份)顯示不一樣的本地或者網絡圖片.爲了給圖片作區別.就須要不一樣的命名方式. 好比普通身份(status_normal),vip身份(status_vip). 也就是說在基礎的圖片名後面加上身份標記.

皮膚.png

  1. 須要寫一個UIImage的Category. 須要處理的是:將系統的imageNamed方法替換成本身的方法MC_imageNamed.在這方法裏面進行身份/權限的判斷.拼接不一樣的圖片名稱.達到換膚的目的.
#import "UIImage+Helper.h"
#import <objc/runtime.h>

@implementation UIImage (Helper)

+ (void)load {

    // 獲取UIImage的imageNamed方法
    Method imageNameddd = class_getClassMethod([UIImage class], @selector(imageNamed:));
    // 獲取MC_imageNamed方法
    Method MC_imageNamed = class_getClassMethod([UIImage class], @selector(MC_imageNamed:));
   // 方法替換
    method_exchangeImplementations(imageNameddd, MC_imageNamed);
}

+ (nullable UIImage *)MC_imageNamed:(NSString *)name {
    // 用戶的權限
    NSInteger roleId = 0;
    if (roleId == 0) {
        name = [NSString stringWithFormat:@"%@_normal",name];
    } else {
        name = [NSString stringWithFormat:@"%@_vip",name];
    }
    return [self MC_imageNamed:name];
}

@end
  1. 使用.
    正常的圖片賦值.imageView.image = [UIImage imageNamed:@"status"];

三.說明
1.須要導入<objc/runtime.h>
不導入會報錯
Declaration of 'Method' must be imported from module 'ObjectiveC.runtime' before it is requiredgithub

Objective-C語言是一門動態語言,它將不少靜態語言在編譯和連接時期作的事放到了運行時來處理。這種動態語言的優點在於:咱們寫代碼時可以更具靈活性,如咱們能夠把消息轉發給咱們想要的對象,或者隨意交換一個方法的實現等。這種特性意味着objective-c不只須要一個編譯器,還須要一個運行時系統來執行編譯的代碼。對於Objective-C來講,這個運行時系統就像一個操做系統同樣:它讓全部的工做能夠正常的運行。這個運行時系統即Objc Runtime。Objc Runtime實際上是一個Runtime庫,它基本上是用C和彙編寫的,這個庫使得C語言有了面向對象的能力。runtime的強大之處在於它能在運行時建立類和對象。objective-c

2.換膚demo下載地址網絡

相關文章
相關標籤/搜索