响应链遇到手势,问题分析

iOS 全屏侧滑/UIScrollView/UISlider间滑动冲突 代码地址如下:http://www.demodashi.com/demo/13848.html 效果预览 一、前期准备 有一个支持全屏侧滑返回的视图控制器ViewController,ViewController.view上有一个UIScrollView,UIScrollView上有UISlider。俺直接在之前的示例Demo上演示,地址:iOS 自定义转场动画 二、问题展示 现象 1... 阅读详情

手势是ios开发不可或缺的一部分,但对于ios的手势及事件相应机理大家并不知道,所以今天给大家讲一讲ios的事件相应机理

首先,ios的事件传递是依靠“响应链”传递的,当传递到链的某一个链环上的对象处理了这个事件,事件就停止传递。那么响应链是神马东西?

响应链是由一组UIResponder(能够响应时间的基类)组成的对象,当然有事件头和事件尾,事件从头开始传递的,挨个询问是否处理当前事件。处理的话,就停止传递。

对于一个App的“响应链”是如何建立的,建立需要什么东西。

我们先说app的结构,一般的app是先生成一个AppDelegate 和一个Application,然后加Window,在加rootview,在加其他的view如下图

                                                    

                                                                                                                          图1

从图中可以看出,app的生成次序,先是AppDelegate 和UIApplication,然后是Window ,下来是各种view,而响应链也是在这种结构的基础上链接起来的,形成了一个树形结构。

从图中可以看出红色的标号和箭头,这个是响应链的顺序。那么响应链是如何产生的呢,有以下两种情况。

1.addsubview,将一个普通的view B加到 A上 那么B的nextresponder(下一个响应者) 就被赋值为A。

2.如果一个veiw不是普通的view,它是某个viewcontroller的根veiw,例如图中的A,A的nextresponder在A从初始化完后就赋值为viewControllerA。然后当A被addsubview到rootview的时候,Controller A的nextresponder被复制为rootview。

响应链的构建不是统一在某一个地方一次构建,而是当产生addsubview时或者在viewController 初始化view时就会触发。触发的仅仅是两个对象,superview和 subview,或者是superview和subview的viewcontroller

既然响应链是一个树形结构,那么事件也就不能view的兄弟之间传递。

补充,UIApplication的nextresponder是AppDelegate

讲完响应链,那么下来事件是如何传递的。

首先,当用户触摸时,UIKit先创建一个事件对象,加到事件队列中去,然后UIApplication从中取出来,然后来确定响应链,然后依次询问处理。

如何确定响应链。

有个hittesting过程。如下

首先先找到window ,

1.调用hitTest:withEvent:,hitTest:withEvent:先调用pointInside:withEvent:来判断事件是否发生在自己的区域内

2.如果返回YES,那么就从window的每个subview开始调用1过程。然后一层一层调用下去找到最顶部的view。

当然了hitTest:withEvent:在除了pointInside:withEvent:同时,还会参考view的userinteractionenabled和view的隐藏属性及alpha值,当view隐藏,或者userinteractionenabled为NO,或者alpha小于0.01, hitTest:withEvent:会返回NO。比如说view A 和view B,如下图

                                                                                         

                                                                                                                                 图2

A和B的superview 首先会调hitTest:withEvent:在B上,发现B隐藏,或者userinteractionenabled为NO,或者alpha小于0.01,那么它就放弃了B,转而检查A。

以上就是确定响应链,然后传递就很简单了。但是有了手势以后,稍微复杂了点。

首先,我们每个手势,其实是一系列的UIEvent。

1,每次传递其中有一个,他会从响应链的最前面开始传递,先讲event传递给响应链顶部的View的手势们。然后看有没有识别的,如果没有就继续到下一个响应者的手势们,如果立即识别,那么就停止传递。如果传递了整个链,还没有发现有识别的,怎么办呢。别以为事件就丢掉了,事件会从回到链的最前端,然后开始找第一个实现touch(touchbegin,touchend,等等)的view进行识别,然后停止本次传递。

2.从事件中再取出一个,继续进行1过程。最终到没有事件位置。

注意:View判断能否处理  的标准是  1、手势的响应 2、继承于UIControl 3、继承于UIScroll  都会阻断响应者链条的往上传递,就停止传递 

 

可以简单理解,响应链跟事件传递时的顺序相反
事件传递先从上往下(UIApplication->window->view),响应是从下往上。

touches默认做法是把事件顺着响应者链条向上抛,直到找到重写了该方法的。否则,最后该事件作废。

touches的默认做法: 

@implementation MyView 
//只要点击控件,就会调用touchBegin,如果没有重写这个方法,自己处理不了触摸事件
// 上一个响应者可能是父控件
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
    // 默认会把事件传递给上一个响应者,上一个响应者是父控件,交给父控件处理
    [super touchesBegan:touches withEvent:event]; 
    // 注意不是调用父控件的touches方法,而是调用父类的touches方法
    // super是父类 superview是父控件 
}
@end 

 

 

Mediapipe实现手势识别教程 本文介绍了手势识别的详细思路和代码,希望能帮助到大家! 阅读详情

相关推荐

鸿蒙原生APP开发之手势事件冲突解决方案

在复杂的应用界面中,多个组件嵌套时同时绑定手势事件,或者同一个组件同时绑定多个手势,都有可能导致手势事件产生冲突,达不到用户的预期效果。本文从事件响应的机制入手,介绍手势触发的基本流程,以及如何响应手势事件,了解背后的执行原理,并用来解决冲突问题等。事件响应链收集手势响应优先级手势响应控制常见手势冲突问题对于一般同类型的手势,系统手势优先于自定义手势执行,可以通过priorityGesture或者parallelGesture的方式来绑定自定义手势**,例如下面这个示例:

CTrup的博客 1529

iOS开发事件分发机制—响应链—手势影响

1、提纲 什么是iOS的事件分发机制 ? 一个事件UIEvent又是如何响应的? 手势对于响应链有何影响? 2、事件分发机制   2.1、来源     以直接触摸事件为例: 当用户一个手指触摸屏幕是会生成一个UITouch对象,多个手指就是多个对象,手指移动系统会更新对象的相应信息。 系统会将UITouch对象封装生成一个事件UIEvent对象,将这个事件交给...

weixin_34032779的博客 430

有时UIGestureRecognizer手势识别不出来问题分析及方案

有时我们添加的UIGestureRecognizer识别不出来,分析原因至少有以下三种可能: - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGest

dnj630的专栏 6587

UI课程(事件手势/阻断影响者链/手势)

2016/1/8 第三天: 今天学了1.事件手势(阻断响应者链),2.手势(设置添加各种手势) 学习计划:1.先把之前OC类和对象,setter/getter,继承的代码抄一遍,再把之前没搞懂的查缺补漏。(一个小时)2.今天学的课堂代码边写边复习一遍。3.今天的思维导图。4.课后作业。还有时间就把微信朋友圈制作了。 明天就是周六了,但是也不能放松啊! 还有想我一样

机智少年橙子君的博客 351

RichEditor怎么禁用手势响应?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1158

58、iOS触摸事件与手势处理全解析

本文深入解析了iOS开发中的触摸事件与手势处理机制,涵盖响应链的工作原理、多点触控架构、四个触摸通知方法的使用,并通过两个实际应用(TouchExplorer和Swipes)展示了如何检测触摸事件和滑动手势。文章还分析了滑动手势的检测原理,介绍了开发中需要注意的问题、常见问题的解决方案以及应用的扩展与优化方向。通过本文,开发者可以全面掌握iOS触摸交互的核心知识,并应用于实际开发中,提升应用的交互体验。

blue42的博客 117

响应链和手势

Cocoa Touch没有公开任何代表

849

UE 顶点动画工具 (VAT)

导入模型需要勾选全精度UV。

iesoxj的博客 1641

iOS事件响应者链之被忽视的手势识别器工作原理

事件响应链

zhoupengju的博客 2657

Pytorch实现softmax多分类

PyTorch实现softmax多分类

天涯雨的博客 1387

TMC5160 StallGuard2调参避坑指南:从SG_RESULT飘忽不定到稳定检测堵转

本文详细解析了TMC5160的StallGuard2功能在堵转测试中的调参技巧,从SG_RESULT波动问题到稳定检测的完整解决方案。通过电流环与反电动势分析、电源噪声处理及低速校准法等实用方法,帮助工程师实现工业级可靠的堵转检测,避免误触发和检测失效问题。

weixin_28727975的博客 378

iOS 全屏侧滑手势/UIScrollView/UISlider间滑动手势冲突

一、前期准备 有一个支持全屏侧滑返回的视图控制器ViewController,ViewController.view上有一个UIScrollView,UIScrollView上有UISlider。俺直接在之前的示例Demo上演示,简书地址:iOS 自定义转场动画 ,Github地址 :WSLTransferAnimation 二、问题展示 现象 1、UIScrol...

wsl2ls的博客 1235

endnote让参考文献整整齐齐

这篇文章主要是针对利用 endnote 插入参考文献时,参考文献第一行和后面的行对不齐的问题 下面是示意图 可以看到我们的参考文献对的整整齐齐的,比较好看。 下面介绍具体步骤 1、打开endnote。编辑我们使用的参考文献样式。我这儿是叫 ZZ_MODIFIED_GEEBINF 复制 2、找到布局,每个参考开头,将光标放在在参考开头后面,点插入字段,制表符 3、右下角悬挂式输出哪儿选择全部段...

雾隐雾现的至渝博客 5万+

ios 滑动手势事件 与cell touchevent事件_深入理解 iOS 事件机制

作者 | Genosage,95后,iOS开发,目前就职于腾讯北京,主要工作和SDK相关,恐怖电影/游戏爱好者。来源 |掘金,原文内容更丰富,可通过“阅读原文”查看。前言这篇文章始于一个需求:我们在 SDK 提供的某个 View 的 Subview 中实现了单击双击等多个 Gesture Recognizer,而客户希望自己在这个 View 上的单击手势不会冲突,同时没有延迟。借此机会...

weixin_36472741的博客 566

【阅读文献笔记】FoundationStereo: Zero-Shot Stereo Matching

提出首个零样本泛化立体匹配基础模型设计 STA 模块融合单目先验提出 AHCF 模块增强代价滤波构建 100 万合成数据集 FSD + 自净化流程。

qq_46460379的博客 1257

语音算法面试复习系列3——语音识别基础 + CTC 详解

摘要:本文系统讲解了语音识别(ASR)的核心算法CTC。主要内容包括:1) ASR的核心挑战是输入音频帧与输出文字序列的对齐问题;2) CTC通过引入blank标记和动态规划算法,无需对齐标注即可训练;3) 详细解析CTC前向算法实现路径概率求和,以及贪心和Beam Search解码方法;4) 指出CTC的条件独立性假设导致无法建模输出依赖关系;5) 对比CTC与传统方法和Attention/Transducer的优缺点,分析实际应用中的subsampling技术。文章包含数学推导、代码实现和面试常见问题,

m0_60605453的博客 305

ios layer uiview 属性_深入理解 iOS 事件机制

作者 | Genosage,95后,iOS开发,目前就职于腾讯北京,主要工作和SDK相关,恐怖电影/游戏爱好者。来源 |掘金,原文内容更丰富,可通过“阅读原文”查看。前言这篇文章始于一个需求:我们在 SDK 提供的某个 View 的 Subview 中实现了单击双击等多个 Gesture Recognizer,而客户希望自己在这个 View 上的单击手势不会冲突,同时没有延迟。借此机会...

weixin_39653764的博客 279

VS Code下载安装与使用教程

VSCode下载安装与使用教程

weixin_46713695的博客 4万+

事件传递,响应者链以及手势识别器

文章目录关于我的仓库前言好多概念“响应链”(responder chain)UIEventUITouchUIEvent与UITouch手势识别器【**GESTURE RECOGNIZER**】UIView,UIGestureRecognizer以及UIControl响应者链全貌hit-test小实验:hittest调用顺序hittest调用顺序问题:为什么我们的hittest走了两次,打印了两遍?...

KevinAshen的博客 618

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2193

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

iOS 事件传递&响应链

往往在子view超出父view时,超出的部分不会响应点击事件 原因就在于: iOS的事件响应机制 一个触摸事件的响应过程如下: 用户触摸屏幕时,UIKit会生成UIEvent对象来描述触摸事件。对象内部包含了触摸点坐标等信息。 通过Hit Test确定用户触摸的是哪一个UIView。这个步骤通过- (UIView *)hitTest:(CGPoint)point withEvent:(UIEve...

qiangshuting的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

鸿蒙开发5.0案例分析:手势事件冲突解决方案

在复杂的应用界面中,多个组件嵌套时同时绑定手势事件,或者同一个组件同时绑定多个手势,都有可能导致手势事件产生冲突,达不到用户的预期效果。本文从事件响应的机制入手,介绍手势触发的基本流程,以及如何响应手势事件,了解背后的执行原理,并用来解决冲突问题等。事件响应链收集手势响应优先级手势响应控制常见手势冲突问题对于一般同类型的手势,系统手势优先于自定义手势执行,可以通过priorityGesture或者parallelGesture的方式来绑定自定义手势**,例如下面这个示例:**

2501_91726121的博客 1164

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

鸿蒙5.0 APP开发案例分析:手势事件冲突解决方案

在复杂的应用界面中,多个组件嵌套时同时绑定手势事件,或者同一个组件同时绑定多个手势,都有可能导致手势事件产生冲突,达不到用户的预期效果。本文从事件响应的机制入手,介绍手势触发的基本流程,以及如何响应手势事件,了解背后的执行原理,并用来解决冲突问题等。事件响应链收集手势响应优先级手势响应控制常见手势冲突问题对于一般同类型的手势,系统手势优先于自定义手势执行,可以通过priorityGesture或者parallelGesture的方式来绑定自定义手势**,例如下面这个示例:**

mn_xiaona666的博客 1055

IOS 事件,响应链机制分析

IOS 事件,响应链机制分析1. 事件分发和响应者链条1.1 简述2. 事件分发3. 响应者链条2. 事件传递和响应原理分析2.1事件传递流程图2.2 HitTest 、pointInside2.3 UIRespond 与 响应链的组成2.4 手势事件2.5 1. 事件分发和响应者链条 1.1 简述 事件分发:自上而下的由UIApplication开始,一路往最具体的View查找,直到找到最应该...

kyl282889543的博客 778

React Native for OpenHarmony 实战:PanResponder 手势响应详解

协商阶段:多个视图通过等方法竞争响应权响应阶段:获得响应权的视图处理后续手势事件fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;YesNo触摸开始协商阶段竞争响应权获得响应权?响应阶段事件终止通过本文的深入探讨,我们全面掌握了 PanResponder 在 OpenHarmony 平台的应用技术要点。

摘星编程的博客 1462
上一篇: Block本质
下一篇: NSTimer 循环引用分析与解决方案
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值