ios-runtime拦截touch事件,展示用户触摸效果
【展示效果说明】
对 app 操作录屏时,展示出手指在 app 上的触摸效果可以看到具体点击情况,感觉这样比较直观方便,也不用做视频后期了。
这里简单用 runtime 实现了一个这样的效果,不需要修改任何代码,只要将 UIWindow+Touch.m 分类导入工程即可。
展示效果如下:
   
  
【实现思路】
1. 要拦截到所有的点击事件,获取点击相对于屏幕的位置。ios中事件分发中点击事件应该是这样的: 系统第一个得到点击事件 -> 分发给application -> 分发给 window -> window 内的子 view 层层遍历。
2. 只是一个小功能,要让这个功能可控,不要对原有代码进行改动。用 runtime 交换系统方法进行touch事件拦截,在分发事件时加入自己的一些代码。
3. 拿到触摸点的位置后创建 view 展示一些动画效果就可以。
上面第1点中可以知道,事件在application中进行拦截最靠谱,因为系统第一个分发就是给它,但这里操作都是UI相关,所以UI相关事件放在 window 上进行处理比较合适。所以这里就是交换的 window 对象的 sendEvent: 方法。
【代码】
新建 UIWindow + Touch 分类,在 .m 文件中交换 sendEvent 方法,同时加上自己处理的代码,主要是在获取点击x,y的位置,然后添加一个view,加上一点动画,最终就有了上述效果。 UIWindow + Touch.m 代码如下:
#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(ljs_sendEvent:));
method_exchangeImplementations(m1, m2);
} - (void)ljs_sendEvent:(UIEvent *)event
{
[self ljs_sendEvent:event];
// 对点击事件进行处理
[self dealTouch:event];
} - (void)dealTouch:(UIEvent *)event
{
UITouch *touch = event.allTouches.anyObject;
if (touch.phase == UITouchPhaseEnded) {
return;
} static CGFloat width = ;
if (event.type == UIEventTypeTouches) { CGPoint point = [event.allTouches.anyObject locationInView:self]; CGFloat oringX = point.x - width / ;
CGFloat oringY = point.y - width / ;
CGRect rect = CGRectMake(oringX, oringY, width, width);
UIView *blackV = [[UIView alloc] initWithFrame:rect];
blackV.alpha = 0.3;
blackV.layer.cornerRadius = width / ;
blackV.backgroundColor = [UIColor purpleColor];
[self addSubview:blackV];
[self bringSubviewToFront:blackV];
// 设置动画
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
animation.duration = 0.3;
animation.fromValue = @;
animation.toValue = @;
animation.fillMode = @"backwards";
animation.removedOnCompletion = YES;
[blackV.layer addAnimation:animation forKey:@"an1"]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.27 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[blackV removeFromSuperview];
});
}
} @end
ios-runtime拦截touch事件,展示用户触摸效果的更多相关文章
- React-Native系列Android——Touch事件原理及状态效果
		Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ... 
- touch事件(寻找触摸点  e.changedTouches)
		<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ... 
- Touch事件分发源码解析
		~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以下源码基于Gingerbread 2.3.7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.先看ViewGroup的di ... 
- Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇
		2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ... 
- 自定义View系列教程07--详解ViewGroup分发Touch事件
		深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ... 
- jquery mobile Touch事件
		Touch事件在用户触摸屏幕(页面)时触发 1.jquery mobile tap tap事件在用户敲击某个元素时触发 $("p").on("tap",fucn ... 
- Android:ViewGroup和View的Touch事件
		Android中ViewGroup和View中的Touch事件传递机制分析 关键字:GroupView:View:Touch事件 基础知识: onInterceptTouchEvent():在View ... 
- touch事件的分发和消费机制
		Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ... 
- 手势识别官方教程(8)拦截触摸事件,得到触摸的属性如速度,距离等,控制view展开
		onInterceptTouchEvent可在onTouchEvent()前拦截触摸事件, ViewConfiguration得到触摸的属性如速度,距离等, TouchDelegate控制view展开 ... 
随机推荐
- 网页免费转换为可编辑的PDF
			Chrome自带的"打印"功能中,另存为PDF 可选择保存选中的内容.如果浏览器/网络出错,不能纠正.(推荐0) https://www.printfriendly.com (有C ... 
- JavaSpring【三、Bean】
			配置项 id bean的标识 class bean的类全名 scope bean的作用域 constructor-arg 构造注入 properties 设值注入 autowire 装配模式 lazy ... 
- Mysql(四):数据操作
			一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ... 
- (二十五)防编译后函数名通过ida查看到
			在使用多个动态库时,两个动态库之间有可能存在相同名称的函数,这样会出现只有第一个函数生效,即所有对该函数的调用都将指向第一个加载的动态库的同名函数中.这样就会很混乱,而且在想改名称也不是很简单的情况下 ... 
- C++踩坑记录(一)std:;string的析构
			之前写服务端程序有一个往消息队列里面推json的过程,然后发现推进去C#端取到的无论如何都是个空指针 简单复现一下现场 string str1 = string("hello1") ... 
- 06—mybatis缓存机制
			MyBatis缓存分为一级缓存和二级缓存 一级缓存MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何 ... 
- SpringBoot AOP注解式拦截与方法规则拦截
			AOP的本质还是动态代理对方法调用进行增强. SpringBoot 提供了方便的注解实现自定义切面Aspect. 1.使用需要了解的几个概念: 切面.@Aspect 切点.@Pointcut. 通知. ... 
- bat文件设置环境变量脚本
			:: 获取管理员权限 @echo off % mshta vbscript:CreateObject()(window.close)&&exit cd /d "%~dp0&q ... 
- hover([over,]out)
			hover([over,]out) 概述 一个模仿悬停事件(鼠标移动到一个对象上面及移出这个对象)的方法.这是一个自定义的方法,它为频繁使用的任务提供了一种“保持在其中”的状态. 当鼠标移动到一个匹配 ... 
- map(callback)将一组元素转换成其他数组(不论是否是元素数组)
			map(callback) 概述 将一组元素转换成其他数组(不论是否是元素数组) 你可以用这个函数来建立一个列表,不论是值.属性还是CSS样式,或者其他特别形式.这都可以用'$.map()'来方便的建 ... 
