美文网首页iOS -- runtime
iOS - runtime-02拦截系统方法

iOS - runtime-02拦截系统方法

作者: Coder_张三 | 来源:发表于2019-10-31 14:51 被阅读0次

需求:使用 runtime 拦截系统方法,改变 UIView 的背景颜色。
为什么这么做?假如很多界面都是使用同一种颜色,之后突然有需求,把颜色全部改成另一种颜色,如果一个一个界面的去改,很浪费时间,这个时候 runtime 就起到了很好的作用,用它来拦截系统设置视图背景颜色的方法,改成自己想要的颜色。

  • 思路及步骤
    1.创建一个 UIView 的分类,在 .m 文件导入 runtime 的头文件。
    2.实现 load 方法。
    3.自定义设置背景颜色的方法,判断是否是需要改变的颜色
    4.获取系统方法
    5.获取自定义方法
    6.交换它们之间的 IMP 方法
    先来看没有添加分类时候的效果,设置视图控制器的背景颜色为黄色。
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = UIColor.yellowColor;
    

}
@end

运行起来没什么改变,还是黄色。


WechatIMG21.jpeg

下面开始按上面的步骤实现,这里还是直接贴代码吧,代码很少。

//
//  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.获取系统设置背景颜色的方法
    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

添加完之后,再运行,看一下效果,发现背景颜色果然被改变了!


WechatIMG22.jpeg

至此,拦截系统方法,交换设置背景颜色的方法就实现了。

相关文章

  • iOS - runtime-02拦截系统方法

    需求:使用 runtime 拦截系统方法,改变 UIView 的背景颜色。为什么这么做?假如很多界面都是使用同一种...

  • iOS面试题:runtime的应用

    原文:iOS面试题大全 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法) 实现给分类增加属...

  • iOS 系统返回按钮事件拦截Swift版本

    iOS 系统返回按钮事件拦截OC版本系统返回按钮事件拦截 主要实现原理 如何使用 如何禁用系统?右滑返回手势 de...

  • iOS原生与JS交互最新版

    JS调iOS方法 UIWebView Swift方法同理 WebView代理中拦截Url跳转 WKWebView ...

  • 回退http协议

    在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。 具体方法: 在项目的i...

  • ios开发防止App被抓包(可正常请求)

    实现iOS应用底层所有网络请求拦截(如ajax请求拦截),包含http-dns解决方法,有效防止DNS劫持,用于分...

  • ios开发防止App被抓包

    实现iOS应用底层所有网络请求拦截(如ajax请求拦截),包含http-dns解决方法,有效防止DNS劫持,用于分...

  • runtime拦截系统方法

    昨天朋友问我,怎么截取系统方法,第一个反应是使用父类,但是后来想了一下,这样处理的话又太过屌丝,后来上网一番查找,...

  • Objective-C与JavaScript的交互

    iOS原生应用和Wed页面的交互大致有以下几种方法: iOS 7之后的JavaScriptCore 拦截协议 第三...

  • JS交互

    简介 iOS原生应用和web页面的交互大致上有以下这几种方法: JavaScriptCore(iOS7之后) 拦截...

网友评论

    本文标题:iOS - runtime-02拦截系统方法

    本文链接:https://www.haomeiwen.com/subject/fehtbctx.html