首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

iOS开发--事件传递,响应者链条及常见面试题

,首先我们通过一张图来简单了解一下事件传递以及响应. 1.响应者链条 响应者链条就是由多个响应者对象连接起来链条,它作用就是让我们能够清楚看见每个响应者之间联系,并且可以让一个时间多个对象处理.... 2.响应过程 iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application事件队列,单例UIApplication会从事件队列中取出触摸事件并传递给单例...1.自己能响应触摸事件 2.触摸点在自己身上 3.从后往前递归遍历子控件, 重复两步 4.如果没有符合条件子控件, 那么就自己最合适处理 3.两个重要响应方法(UIView) 1.hit-test...事件传递是从上自下传递,响应是从下到上,所谓就是父视图而已,也就是离窗口最近. 2.穿透控件: 2.1 如果我们不想让某个视图响应事件,只需要重载 PointInside:withEvent:方法...(即调用supertouches方法) 谁是上一个响应者? 1\. 如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它视图 2\.

74931

【IOS开发基础系列】UIView专题

iOS程序启动完毕后,创建第一个视图控件就是UIWindow,接着创建控制器view,最后将控制器view添加到UIWindow,于是控制器view就显示在屏幕上了。...注意这个控制器属性面板“初始化控制器属性”。...iOS中,hit-Testing作用就是找出这个触摸点下面的View是什么,HitTest会检测这个点击点是不是发生在这个View,如果是的话,就会去遍历这个Viewsubviews,直到找到最小能够处理事件...有关触摸事件在响应链分发,就差不多这么多东西,最重要是大家可以看那几个touches方法,多做实验,就可以了解更加深入。...UITouch对象有一个view属性,表示此触摸操作初始发生所在视图,即上面检测hit-test view,此属性在UITouch生命周期不再改变,即使触摸操作后续移动到其他视图之上。

39530
您找到你想要的搜索结果了吗?
是的
没有找到

iOS 小技能: Responder Chain(响应者链)【上篇】

/*返回值表示触摸在view位置 这里返回位置是针对view坐标系(以view左上角为原点(0, 0)) 调用时传入view参数为nil的话,返回触摸点在UIWindow位置*/...响应触摸事件都是屏幕界面元素,而且必须是继承自UIResponder类界面类(包括各种常见视图类及其视图控制器类,UIView和UIViewController)才可以响应触摸事件。...其中,前者用于递归寻找命中者,后者则是检测当前视图是否被命中,即触摸点坐标是否在视图内部。...当触摸事件发生后,系统会将触摸事件以UIEvent方式加入到UIApplication事件队列中,UIApplication将事件分发给根部UIWindow去处理,UIWindow则开始调用hitTest...命中检测具体迭代过程为:如果触摸点在当前视图内,那么递归对当前视图内部所有的子视图进行命中检测;如果不在当前视图内,那么返回NO停止迭代。这样最终会确定屏幕最顶部命中视图元素,即命中者。

1.1K30

史上最详细iOS之事件传递和响应机制-原理篇

我们只能通过子类继承父类,重写子类方法方式处理UIView触摸事件(注意:是UIView触摸事件而不是说 UIViewController触摸事件)。...如果当前view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么父视图就是当前view上一个响应者,事件就传递给它视图 2>在视图层次结构最顶级视图...controller,首先判断视图控制器视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,...则继续交给父视图控制器视图,如果根视图不能处理则交给父视图控制器处理);一直到 window,如果window还是不能处理此事件则继续交给application处理,如果最后application还是不能处理此事件则将其丢弃...;就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者touches….方法 如何做到一个事件多个对象处理: 因为系统默认做法是把事件抛给父控件,所以可以通过重写自己touches

10.5K70

【IOS开发基础系列】UIScrollView专题

当手指触摸后,scroll view会暂时拦截触摸事件,使用一个计时器。...假如定时器行动时,没有任何位置改变,滚动视图就发送一个跟踪事件触摸视图。如果在定时器消失前,用户拖动他们手指足够远,滚动视图取消子视图任何跟踪事件,滚动它自己。...那么这里就有疑问了,既然该属性设置未来NO了,那么岂不是UIScrollView不能处理任何事件了,那么为何在视图上快速滚动时候,UIScrollView还能移动那。...所以所有的touch 事件都会进入到它自己里面去了。内部touch事件检测到这个事件是不是和自己相关,或者处理或者除递给内部view。...很好理解:若多个scrollView响应返回顶部事件,系统就不知道到底要将那个scrollView返回顶部了,因此也就不做任何操作了。

35830

iOS面试题:事件传递和响应机制

主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步。 找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理。 2....事件响应 4.1 触摸事件处理整体过程 1 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 2 找到最合适视图控件后,就会调用控件touches方法来作具体事件处理...view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么父视图就是当前view上一个响应者,事件就传递给它视图 2 在视图层次结构最顶级视图...2.UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序主窗口(keyWindow)。 3.主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件。...如何做到一个事件多个对象处理: 因为系统默认做法是把事件抛给父控件,所以可以通过重写自己touches方法和父控件touches方法来达到一个事件多个对象处理目的。

1.2K10

iOS 中事件响应

多个手指先后触摸,系统会根据触摸位置判断是否更新同一个 UITouch 对象。...,iOS 系统便会根据 Hit-Testing 过程来确定触摸事件发生在哪个视图对象,其实 Hit-Testing 过程本质就是找到第一响应者(或最佳响应者,后文统一称为第一响应者)。...UIView:若视图控制器视图,则其 nextResponder 为控制器对象;否则,其 nextResponder 为父视图; UIViewController:若控制器视图是 window...系统通过hitTest方法沿视图层级树从底向上(从根视图开始),从后向前(从逻辑更靠近屏幕视图开始)进行遍历,最终返回一个适合响应触摸事件 View,并在过程中为 UITouch 记录了 view...可以注意到addTarget时,target类型是一个可选值,传入 nil 时,Application会自动在响应链从上往下寻找能响应action对象。

2.5K11

iOS-控件响应用户控制事件事件处理

:(UIView *)view; 返回值表示触摸在view位置 这里返回位置是针对view坐标系(以view左上角为原点(0, 0)) 调用时传入view参数为nil的话,返回触摸点在...2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件...,这也是整个事件处理过程第一步 4.找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理 touchesBegan… touchesMoved… touchedEnded… 如果父控件不能接收触摸事件...2> 如果当前这个view不是控制器view,那么父控件就是上一个响应者 响应者链事件传递过程 如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它视图视图层次结构最顶级视图...,则将其丢弃 响应者链条示意图 响应者链条:是由多个响应者对象连接起来链条 作用:能很清楚看见每个响应者之间联系,并且可以让一个事件多个对象处理。

94670

iOS-UITouch事件处理详解1. iOS中事件基本介绍2.UITouch3.UIEvent4. 事件产生和传递5. 通过UITouch方法监听View触摸事件缺点

,通常,先发送事件给应用程序主窗口(keyWindow) 主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步 找到合适视图控件后,就会调用视图控件touches...4.4 触摸事件处理详细过程(响应者链传递过程) 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 找到最合适视图控件后,就会调用控件touches...方法来作具体事件处理 这些touches方法默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理 判断上一个响应者,如果view控制器存在,控制器就为上一个响应者,传递给控制器;...如果控制器不存在,其父视图为上一个响应者,将其传递给它视图视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,...,并且可以让一个事件多个对象处理。

1.6K60

iOS中手势应用1. 四类事件主要方法2. 响应者链3. 手势识别功能(Gesture Recognizer)4. 手势使用

响应者链 概念吶,我们就不说了,网上文章应该一搜一大堆。这里是比较理论化知识,是比较考验我们对于iOS中触摸事件理解深度。这里就只是用简单方式,写一下自己对于这部分理解。...最终找到这个干活控件,我们学术就叫做第一响应者对象。找到了负责处理按钮之后如何给出相应处理呢?大概过程就是这样: button尝试处理事件。如果它不能处理事件,则将事件传递给其父视图。...button视图(superview)尝试处理事件。如果这个父视图还不能处理事件,则继续将视图继续往上级传。 上层视图(topmost view)会尝试处理事件。...如果这个上层视图还是不能处理事件,则将事件传递给视图所在视图控制器视图控制器会尝试处理事件。如果这个视图控制器不能处理事件,则将事件传递给窗口(window)对象。...方法监听view触摸事件,有很明显几个缺点 必须得自定义view 由于是在view内部touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view触摸事件 不容易区分用户具体手势行为

2.1K40

事件传递、响应者链条

UIApplication -> UIWindow -> Root View -> subview -> ··· -> initalView 系统检测到手指触摸(Touch)操作时,将Touch 以UIEvent...UIApplication从事件队列中取出最新触摸事件进行分发传递到UIWindow进行处理。...:原理 // point是该视图坐标系上点 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 1.判断自己能否接收触摸事件...(即调用supertouches方法),从之前往下走路线往上回传,在其中加入了Viewtroller来处理 如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它父View...在视图层次结构最顶级视图,传递给ViewController ViewController将事件传递给window对象进行处理 window对象继续将事件或消息传递给UIApplication

84710

iOS面试题-UI篇

UIView本身,更像是一个CALayer管理器,访问它跟绘图和坐标有关属性,frame,bounds等,实际内部都是访问它所在CALayer相关属性 UIView有个layer属性,可以返回它主...两者都是在多个试图控制器间跳转函数 presentViewController提供是一个模态视图控制器(modal) pushViewController提供一个栈控制器数组,push/pop 请简述...-(void)viewDidLayoutSubviews; 触摸事件传递 触摸事件传递是从父控件传递到子控件 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件 不能接受触摸事件四种情况...默认就是NO,因此UIImageView以及它子控件默认是不能接收触摸事件 如何找到最合适处理事件控件: 首先,判断自己能否接收触摸事件 可以通过重写hitTest:withEvent:方法验证...如果当前view是控制器view,那么就传递给控制器 如果控制器不存在,则将其传递给它父控件 在视图层次结构最顶层视图也不能处理接收到事件或消息,则将事件或消息传递给UIWindow对象进行处理

1.9K21

iOS中事件产生和传递

●主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步。找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理。...2.事件传递 ●触摸事件传递是从父控件传递到子控件 ●也就是UIApplication->window->寻找处理事件最合适view 注 意: 如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件...,控件就会调用自己hitTest:withEvent:方法 注 意:不管控件能不能处理事件,也不管触摸点在不在这个控件事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法...image.png 1.如果当前view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么父视图就是当前view上一个响应者,事件就传递给它视图...;如果上级视图仍然无法处理则会继续往上传递;一直传递到视图控制器view controller,首先判断视图控制器视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传

87810

iOS 小技能: Responder Chain(响应者链)【下篇】

(keyWindow) 主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,但是这仅仅是整个事件处理过程第一步 找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理 touchesBegan...II 响应者链事件传递过程 1).如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它视图 2).在视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件或消息传递给...2.1 触摸事件处理详细过程 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 找到最合适视图控件后,就会调用控件touches方法来作具体事件处理...如果当前这个view是控制器view,那么控制器就是上一个响应者。...如果当前这个view不是控制器view,那么父控件就是上一个响应者。 2.2 事件传递完整过程 先将事件对象由往下传递(由父控件传递给子控件),找到最合适控件来处理这个事件

87430

iOS14开发-入门知识

Cocoa Touch 层为应用程序开发提供了各种有用框架,并且大部分与用户界面有关,它负责用户在 iOS 设备触摸交互操作以及一些其他关键功能。 创建第一个iOS项目 ?...UIView与UIViewController 初步印象 iOS 开发中,一个界面就是一个 UIViewController(视图控制器),界面上显示内容就是 UIView(视图)。...UIView常见方法 addSubview:添加视图到父视图。 removeFromSuperview:将视图从父视图中移除(需提前讲解触摸方法)。...viewWithTag:根据 tag 值获取视图。 insertSubview:在指定视图/下面插入视图。 bringSubviewToFront:把视图移到最顶层。...@IBAction 写于类中方法。 与 Storyboard 中 UIView 产生事件建立联系。 当相应事件发生时,方法就会被调用。

2.8K40

Android自定义系列——14.MotionEvent

MotionEvent在android触摸事件中起到了很重要作用,本文主要介绍MotionEvent,简要介绍触摸事件,主要包括 单点触控、多点触控、鼠标事件 以及 getAction() 和 getActionMasked...Dialog 就是一个特殊视图(没有占满屏幕大小窗口),能够接收到视图区域外事件(虽然在通常情况下你根本用不到这个事件),除了 Dialog 之外,你最可能看到这个事件场景是悬浮窗,当然啦,想要接收到视图之外事件需要一些特殊设置...Android 在 2.0 版本时候开始支持多点触控,一旦出现了多点触控,很多东西就突然之间变得麻烦起来了,首先要解决问题就是 多个手指同时按在屏幕,会产生很多事件,这些事件该如何区分呢?...() 当多个手指在屏幕按下时候,会产生大量事件 一般来说我们可以通过为事件添加一个int类型index属性来区分,为了添加一个通常数值不会超过10index属性就浪费一个int大小空间简直是不能忍受...用不同设备对这两个方法进行了测试,然而不同设备测试出来结果不相同,之后经过多方查证,发现是系统问题,有的设备只有 getSize() 能用,有的设备只有 getPressure() 能用,而有的则两个都不能用

1.4K10

touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event使用

大家好,又见面了,是你们朋友全栈君。...首先触摸对象是视图,而视图类UIView继承了UIRespnder类,但是要对事件作出处理,还需要重写UIResponder类中定义事件处理函数。...因为UIEvent包含了整个触摸过程中所有的触摸对象,因此可以调用allTouches方法获取该事件内所有的触摸对象,也可以调用touchesForVIew:或者touchesForWindows:取出特定视图或者窗口上触摸对象...不管时一个手指还是多个手指,轻击操作都会使每个触摸对象tapCount加1,由于上面的例子不需要知道具体触摸对象位置或时间等,因此可以直接调用touchesanyObject方法来获取任意一个触摸对象然后判断其...,用CGPoint变量记录,然后在手指移动事件touchesMoved方法中获取触摸对象当前位置,并通过于与原始位置差值计算出移动偏移量,再设置当前视图位置。

49420

IOS开发系列——UIView专题之五:常用开发技巧篇

5.1.4hitTest方法以及不规则区域内触摸事件处理方法 5.1.4.1hitTest:withEvent:方法流程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application...操作初始点所在视图(View),即需要将触摸事件传递给其处理视图,称之为hit-test view。...对于每个触摸操作都会有一个UITouch对象,UITouch对象用来表示一个触摸操作,即一个手指在屏幕按下、移动、离开整个过程。...UITouch对象有一个view属性,表示此触摸操作初始发生所在视图,即上面检测hit-test view,此属性在UITouch生命周期不再改变,即使触摸操作后续移动到其他视图之上。...the responder chain 在此例子中button,scrollview同为topView视图,但scrollview覆盖在button之上,这样在在button触摸操作返回hit-test

98320

如何响应用户交互事件

手势操作在Flutter中分为两类: 第一类是原始指针事件(Pointer Event),即原生开发中常见触摸事件,表示屏幕触摸(或鼠标、手写笔)行为触发位移行为。...第二类则是手势识别(Gesture Detector),表示多个原始指针事件组合操作,点击、双击、长按等,是指针事件语义化封装。 接下来,我们先来看一下原始指针事件。...指针事件 指针事件表示用户交互原始触摸数据,手指接触屏幕 PointerDownEvent、手指在屏幕移动 PointerMoveEvent、手指抬起 PointerUpEvent,以及触摸取消...像这样手势识别发生在多个存在父子关系视图时,手势竞技场会一并检查父视图和子视图手势,并且通常最终会确认由子视图来响应事件。...而这也是合乎常理:从视觉效果看,子视图视图层级位于父视图之上,相当于对其进行了遮挡,因此从事件处理上看,子视图自然是事件响应第一责任人。

2.1K10
领券