【展示效果说明】

  对 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事件,展示用户触摸效果的更多相关文章

  1. React-Native系列Android——Touch事件原理及状态效果

    Native原生相比于Hybrid或H5最大长处是具有流畅和复杂的交互效果,触摸事件便是当中重要一项,包括点击(Click).长按(LongClick).手势(gesture)等. 以最简单常见的点击 ...

  2. touch事件(寻找触摸点 e.changedTouches)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. Touch事件分发源码解析

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 以下源码基于Gingerbread 2.3.7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.先看ViewGroup的di ...

  4. Android Touch事件之一:Touch事件在父ViewGroup和子View之间的传递篇

    2015-11-26 17:00:22 前言:Android的Touch事件传递和View的实现紧密相连,因此理解Touch事件的传递,有助于我们更好的理解View的工作原理. 1. 几个重要的方法: ...

  5. 自定义View系列教程07--详解ViewGroup分发Touch事件

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  6. jquery mobile Touch事件

    Touch事件在用户触摸屏幕(页面)时触发 1.jquery mobile tap tap事件在用户敲击某个元素时触发 $("p").on("tap",fucn ...

  7. Android:ViewGroup和View的Touch事件

    Android中ViewGroup和View中的Touch事件传递机制分析 关键字:GroupView:View:Touch事件 基础知识: onInterceptTouchEvent():在View ...

  8. touch事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  9. 手势识别官方教程(8)拦截触摸事件,得到触摸的属性如速度,距离等,控制view展开

    onInterceptTouchEvent可在onTouchEvent()前拦截触摸事件, ViewConfiguration得到触摸的属性如速度,距离等, TouchDelegate控制view展开 ...

随机推荐

  1. JPA的API介绍、工具类抽取

    1.Persistence对象 Persistence对象主要作用是用于获取EntityManagerFactory对象的 .通过调用该类的createEntityManagerFactory静态方法 ...

  2. CHD-5.3.6集群安装

    我是基于Apache-hadoop2.7.3版本安装成功后,已有的环境进行安装chd-5..6 已用的环境: JDK版本: java version "1.8.0_191" Jav ...

  3. Django的请求生命周期与中间件中的5中方法

    请求生命周期: 客户端——>WSGI——> 中间件——>路由匹配——>视图函数——>WSGI——>客户端 中间件: 在全局层明处理请求和响应的 form djang ...

  4. 2.03_Python网络爬虫Http和Https

    一:HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法,以明文的形式传输,效率高,但是不安全 HTTPS ...

  5. nodejs建站+github page 建站问题总结

    本文介绍 昨天吃晚饭的时候,在B站偶然看到一个关于搭建自己博客的视频,过程讲的很详细,于是就有了自己想尝试一下的冲动,所以,在晚上的时候,尝试了下,但是,过程并没有视频中说的那么顺利,看了网上很多帖子 ...

  6. PAT Basic 1065 单身狗 (25 分)

    “单身狗”是中文对于单身人士的一种爱称.本题请你从上万人的大型派对中找出落单的客人,以便给予特殊关爱. 输入格式: 输入第一行给出一个正整数 N(≤ 50 000),是已知夫妻/伴侣的对数:随后 N ...

  7. okhttp缓存策略源码分析:put&get方法

    对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存 ...

  8. UESTC 2016 Summer Training #1 J - Objects Panel (A) 按条件遍历树

    #include <iostream> #include <cstdio> #include <vector> using namespace std; typed ...

  9. ajax的底层实现

    Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现.在 XHR 出现之前,Ajax 式的通信必须借助一些手段 ...

  10. FreeIPA ACI (Access Control Instructions) 访问控制说明

    目录 FreeIPA ACI (Access Control Instructions) 访问控制说明 一.ACI 位置 二.ACI 结构 三.ACI 局限性 四.复制拓扑中的ACI 五.操作ACI ...