注册 登录
  • 欢迎访问Sharezer Blog

iOS全局拦截Touch事件

IOS sharezer 214次浏览 已收录 0个评论

1 原理

拦截到所有的点击事件,获取点击相对于屏幕的位置。ios中事件分发中点击事件应该是这样的: 系统第一个得到点击事件 -> 分发给application -> 分发给 window -> window 内的子 view 层层遍历。

本案例使用 runtime 交换系统方法进行touch事件拦截,在分发事件时加入自己的一些代码。

2 实现

//
//  UIWindow+Touch.m
//  runtimeTest
//
//  Created by Sharezer on 2019/3/11.
//  Copyright © 2019 Sharezer. All rights reserved.
//

#import "UIWindow+Touch.h"
#import <objc/runtime.h>

@implementation UIWindow (Touch)

+ (void)load
{
    // 交换方法
    Method m1 = class_getInstanceMethod([self class], @selector(sendEvent:));
    Method m2 = class_getInstanceMethod([self class], @selector(ls_sendEvent:));
    method_exchangeImplementations(m1, m2);
}

- (void)ls_sendEvent:(UIEvent *)event
{
    [self ls_sendEvent:event];
    // 对点击事件进行处理
    [self dealTouch:event];
}

- (void)dealTouch:(UIEvent *)event
{
    if (event.type == UIEventTypeTouches) {

        CGPoint point = [event.allTouches.anyObject locationInView:self];
        NSLog(@"touch %ld (%f, %f)", (long)[[event.allTouches anyObject] phase], point.x, point.y);
    }
}

@end

3 演示

iOS全局拦截Touch事件

4 结论

可以通过ios-runtime,拦截所有ViewController的Touch事件。


Sharezer , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明iOS全局拦截Touch事件
喜欢 (0)
[liangshaoze@sina.cn]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址