需求:使用 runtime 攔截系統(tǒng)方法理茎,改變 UIView 的背景顏色饿序。
為什么這么做勉失?假如很多界面都是使用同一種顏色,之后突然有需求原探,把顏色全部改成另一種顏色乱凿,如果一個一個界面的去改,很浪費時間咽弦,這個時候 runtime 就起到了很好的作用徒蟆,用它來攔截系統(tǒng)設置視圖背景顏色的方法,改成自己想要的顏色型型。
- 思路及步驟
1.創(chuàng)建一個 UIView 的分類段审,在 .m 文件導入 runtime 的頭文件。
2.實現(xiàn) load 方法输莺。
3.自定義設置背景顏色的方法戚哎,判斷是否是需要改變的顏色
4.獲取系統(tǒng)方法
5.獲取自定義方法
6.交換它們之間的 IMP 方法
先來看沒有添加分類時候的效果,設置視圖控制器的背景顏色為黃色嫂用。
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = UIColor.yellowColor;
}
@end
運行起來沒什么改變型凳,還是黃色。
下面開始按上面的步驟實現(xiàn)嘱函,這里還是直接貼代碼吧甘畅,代碼很少。
//
// UIView+Swizzing.m
// 01-RuntimeSendMessage
//
// Created by Mac on 2019/10/31.
// Copyright ? 2019 Mac. All rights reserved.
//
#import "UIView+Swizzing.h"
#import <objc/runtime.h>
@implementation UIView (Swizzing)
+ (void)load {
// 1.獲取系統(tǒng)設置背景顏色的方法
Method m1 = class_getInstanceMethod(self, @selector(setBackgroundColor:));
// 2.獲取自定義設置背景顏色的方法
Method m2 = class_getInstanceMethod(self, @selector(fb_setBackgroundColor:));
// 3.交換它們之間的 IMP 方法
method_exchangeImplementations(m1, m2);
}
/// 自定義設置背景顏色的方法
/// @param color UIColor
- (void)fb_setBackgroundColor:(UIColor *)color {
// 如果顏色為 yellowColor 往弓,就改變成紅色
if (color == [UIColor yellowColor]) {
[self fb_setBackgroundColor:[UIColor redColor]];
}
}
@end
添加完之后疏唾,再運行,看一下效果函似,發(fā)現(xiàn)背景顏色果然被改變了槐脏!
至此,攔截系統(tǒng)方法撇寞,交換設置背景顏色的方法就實現(xiàn)了顿天。