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展开 ...
随机推荐
- JPA的API介绍、工具类抽取
1.Persistence对象 Persistence对象主要作用是用于获取EntityManagerFactory对象的 .通过调用该类的createEntityManagerFactory静态方法 ...
- CHD-5.3.6集群安装
我是基于Apache-hadoop2.7.3版本安装成功后,已有的环境进行安装chd-5..6 已用的环境: JDK版本: java version "1.8.0_191" Jav ...
- Django的请求生命周期与中间件中的5中方法
请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form djang ...
- 2.03_Python网络爬虫Http和Https
一:HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法,以明文的形式传输,效率高,但是不安全 HTTPS ...
- nodejs建站+github page 建站问题总结
本文介绍 昨天吃晚饭的时候,在B站偶然看到一个关于搭建自己博客的视频,过程讲的很详细,于是就有了自己想尝试一下的冲动,所以,在晚上的时候,尝试了下,但是,过程并没有视频中说的那么顺利,看了网上很多帖子 ...
- PAT Basic 1065 单身狗 (25 分)
“单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数:随后 N ...
- okhttp缓存策略源码分析:put&get方法
对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存 ...
- UESTC 2016 Summer Training #1 J - Objects Panel (A) 按条件遍历树
#include <iostream> #include <cstdio> #include <vector> using namespace std; typed ...
- ajax的底层实现
Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现.在 XHR 出现之前,Ajax 式的通信必须借助一些手段 ...
- FreeIPA ACI (Access Control Instructions) 访问控制说明
目录 FreeIPA ACI (Access Control Instructions) 访问控制说明 一.ACI 位置 二.ACI 结构 三.ACI 局限性 四.复制拓扑中的ACI 五.操作ACI ...