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展开 ...
随机推荐
- 关于写SQL语句的技巧
一.SQL总结写法 SQL的写法无非就是几种,关联查询,子查询,分组函数,各种函数的使用 1.首先根据要做的需求,先分析一下,需要用到哪些查询,例如要用到关联查询,就先把用到的表列出来,比如a,b,c ...
- Appium|Locator Strategy ... is not supported for this session
appim server log InvalidSelectorError: Locator Strategy 'xpath,//android.widget.TextView[@resource-i ...
- 织梦后台系统设置在PHP5.4环境中不能保存中文参数的解决方法
在没用PHP5.4的环境做Dede后台的时候,织梦58一直没有遇到这个问题,昨天上传一个新的模版到空间去测试发现后台的系统基本参数设置中所有的中文内容都无法保存,关于这个问题,其实以前也听说过,知识一 ...
- Django安装和介绍
在CMD和pycharm的安装方法. 先说CMD的安装方法 1,使用pip3 install django 2,进入c:python\Scripts 3,django-admin.exe startp ...
- HTML5常用的语义化标签
快速查询 article | aside | nav | section | header | footer 架构预览 nav 定义导航链接的部分 在页脚显示一个站点的导航链接,如首页.服务信息页面. ...
- Pc贪吃蛇
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- P3377 【模板】左偏树(可并堆) 左偏树浅谈
因为也是昨天刚接触左偏树,从头理解,如有不慎之处,跪请指教. 左偏树: 什 么是(fzy说)左偏树啊? 前置知识: 左偏树中dist:表示到右叶点(就是一直往右下找,最后一个)的距离,特别的,无右节点 ...
- Java:应用Observer接口实践Observer模式
本文出自“子 孑” 博客,原文链接:http://zhangjunhd.blog.51cto.com/113473/68949 在Java中通过Observable类和Observer接口实现了观察者 ...
- 粗暴,干就完了----徐晓冬似的C语言自学笔记-----实现一个链表结构
#include <stdio.h> #include <stdlib.h> #define N 5 /*N 假定数组长度为5*/ typedef struct snode { ...
- 查看nginx服务器状态
编译安装时使用--with-http_stub_status_module开启状态页面模块 [root@proxy ~]# yum -y install gcc pcre-devel openssl- ...