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

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

:(NSSet *)touches withEvent:(UIEvent *)event // 一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法) -...touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent...又会重复上面的两个步骤(传递事件给子控件,1.判断子控件能否接受事件,2.点在不在子控件上)    4.如此循环遍历子控件,直到找到最合适的view,如果没有更合适的子控件,那么自己就成为最合适的view...UIView *childView = self.subviews[i]; // 坐标系的转换,把窗口上的点转换为子控件上的点 // 把自己控件上的点转换成子控件上的点...2>找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理touchesBegan…touchesMoved…touchedEnded…3>这些touches方法的默认做法是将事件顺着响应者链条向上传递

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

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

    如果两根手指同时触摸一个view,那么view只会调用一次 touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象。...如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象 根据touches...,但是这仅仅是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理 touchesBegan… touchesMoved… touchedEnded…...找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理。...2.2 事件传递的完整过程 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件。 调用最合适控件的touches….方法 如果调用了[super touches….]

    97730

    iOS 中的事件响应

    从后往前遍历子视图重复执行 指的是按照 FILO 的原则,将其所有子视图按照「后添加的先遍历」的规则进行命中测试。...,点击TapTestView区域,相关函数调用如上图所示,可以看出先调用了TapTestView的touchesBegan方法,然后接着调用了ParentView的touchesBegan 方法。...,当手势识别失败时才开始调用 touchesBegan 函数。...:inContentView:方法询问是否将事件传递给对应的子视图 (如果返回 NO, 则该事件不会传递给对应的子视图,如果返回 YES,则该事件会传递给对应的子视图,默认为 YES); 当事件被传递给子视图后..., 如果手指位置又发生了移动, 则调用自身的 -touchesShouldCancelInContentView: 方法询问是否取消已经传递给子视图的事件。

    2.8K11

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

    主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步。 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理。 2....,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 2.如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的...3.3 pointInside:withEvent 方法介绍 判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件...事件的响应 4.1 触摸事件处理的整体过程 1 用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件 2 找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理...."); // 2.再调用系统的默认做法,再把事件交给上一个响应者处理 [super touchesBegan:touches withEvent:event]; } 事件的传递和响应的区别

    1.2K10

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

    触摸事件 //一根或者多根手指开始触摸view时自动调用view的下面方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event...; //一根或者多根手指在view上移动时自动调用view的下面方法(随着手指的移动,会持续调用该方法) - (void)touchesMoved:(NSSet *)touches withEvent:...touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent...,这也是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理 4.2 那么主窗口如何找到最合适的控件来处理事件?...(CGPoint)point withEvent:(nullable UIEvent *)event; // 用来判断当前这个点在不在方法调用者上,点必须在方法调用者的坐标系中,判断才会准确 -

    1.7K60

    事件传递、响应者链条

    一、事件 iOS里有三种事件:触摸(touch)、加速(motion)、远程控制 在UIResponder里,有以下事件处理 // 触摸事件 - (void)touchesBegan:(NSSet...[self pointInside:point withEvent:event]) return nil; // 3.从后往前遍历自己的子控件,看是否有子控件更适合响应此事件 int count...return fitView; } } // 没有找到比自己更合适的view return self; } 三、响应者链条 当找到最合适的响应者之后, 便会调用控件相应的...(即调用super的touches方法),从之前往下走的路线往上回传,在其中加入了Viewtroller来处理 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父View...在视图层次结构的最顶级视图,传递给ViewController ViewController将事件传递给window对象进行处理 window对象继续将事件或消息传递给UIApplication

    89010

    iOS事件响应控制 原

    UIApplication会取出队列中最前面的事件,发消息给UIWindow,然后UIWindow会对其所有子视图调用hitTest:withEvent:这个方法,这个方法会返回一个UIView的对象,...这个方法在执行的时候,它会调用当前视图的pointInside:withEvent:这个方法,如果触摸事件在当前视图范围内,pointInside:withEvent:会返回YES,否则会返回NO;如果返回...YES,则会遍历当前视图的所有子视图,统统发送hitTest:withEvent:这个消息,如果返回NO,则hitTest:withEvent:方法返回nil; 上面说起来有些绕,其实就是:hitTest...:withEvent:方法会一层一层的向上找,若最上层响应的子视图pointInside:withEvent:返回YES,则返回此子视图,如果所有的都返回nil,则返回当前视图本身self。...:(NSSet *)touches withEvent:(UIEvent *)event{     NSLog(@"点击了Image"); } 然后将他们创建在一个View上: - (void)viewDidLoad

    55240

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

    ,这也是整个事件处理过程的第一步 4.找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理 touchesBegan… touchesMoved… touchedEnded… 如果父控件不能接收触摸事件...从后往前遍历子控件,重复前面的两个步骤 如果没有符合条件的子控件,那么就自己最适合处理 原理 // point:是方法调用者坐标系上的触摸点的位置 - (UIView *)hitTest:(CGPoint...(由父控件传递给子控件),找到最合适的控件来处理这个事件。...2> 调用最合适控件的touches….方法 3> 如果调用了[super touches….]...2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者 响应者链的事件传递过程 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 在视图层次结构的最顶级视图

    97670

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

    首先触摸的对象是视图,而视图的类UIView继承了UIRespnder类,但是要对事件作出处理,还需要重写UIResponder类中定义的事件处理函数。...根据不通的触摸状态,程序会调用相应的处理函数,这些函数包括以下几个: -(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent...touchesBegan:withEvent方法; 当手指在屏幕上移时,动就会调用touchesMoved:withEvent方法; 当手指离开屏幕时,就会调用...因为UIEvent包含了整个触摸过程中所有的触摸对象,因此可以调用allTouches方法获取该事件内所有的触摸对象,也可以调用touchesForVIew:或者touchesForWindows:取出特定视图或者窗口上的触摸对象...下面举个例子创建可以拖动的视图,这个主要通过触摸对象的位置坐标来实现。因此调用触摸对象的locationInView:方法即可。

    57420

    touchesBegan 触摸事件一、概念介绍二、方法介绍三、参数介绍:touches四、参数介绍:event

    touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent...:方法,并且每次调用时的touches参数中只包含一个UITouch对象 二、方法介绍 UIResponder内部提供了以下方法来处理事件 1....触摸事件 (1)手指按下事件 - (void)touchesBegan:(NSSet *)touches withEvent:(nullable UIEvent *)event;...force; (10)获取最大触摸压力值 @property(nonatomic,readonly) CGFloat maximumPossibleForce; 方法: (1)返回当前触摸点在view上的位置...(2)获取远程控制事件 @property(nonatomic,readonly) UIEventSubtype subtype; UIEventSubtype 枚举: // 不包含任何子事件类型

    2.7K100

    UI篇-UIResponder之事件传递和响应精析

    UIView对象并不一定会把事件传递给每一个子view,因为UIView是通过hitTest方法来判断点击事件发生在哪个子view上面的,会采用逆序查询也就是优先查询后加载的子试图,这样做也是为了优化查找速度...1.调用hitTest方法进行最优响应视图查询 hidden = YES userInteractionEnabled = NO alpha < 0.01 以上三种情况会使该方法返回nil,即当前视图下无最优响应视图...然后我们依次点击A、B视图看下hitTes调用顺序是否和预期一致 ? 点击AView ?...//******************* 华丽的分割线 **************** 系统先调用pointInSide: WithEvent:判断当前视图以及这些视图的子视图是否能接收这次点击事件...,然后在调用hitTest: withEvent:依次获取处理这个事件的所有视图对象,在获取所有的可处理事件对象后,开始调用这些对象的touches回调方法 在自定义View中重写 touchesBegan

    2.5K30

    iOS Programming – 触摸事件处理(2)

    根据不通的触摸状态,程序会调用相应的处理函数,这些函数包括以下几个:             -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent...touchesBegan:withEvent方法; 当手指在屏幕上移时,动就会调用touchesMoved:withEvent方法; 当手指离开屏幕时,就会调用touchesEnded:withEvent...因为UIEvent包含了整个触摸过程中所有的触摸对象,因此可以调用allTouches方法获取该事件内所有的触摸对象,也可以调用touchesForVIew:或者touchesForWindows:取出特定视图或者窗口上的触摸对象...下面举个例子创建可以拖动的视图,这个主要通过触摸对象的位置坐标来实现。因此调用触摸对象的locationInView:方法即可。...,再设置当前视图的位置。

    93870

    IOS触摸事件分发机制详解

    前言 很多时候大家都不关心IOS触摸事件的分发机制的实现原理,当遇到以下几种情形的时候你很可能抓破头皮都找不到解决方案: 某个点击消息由父视图来处理,子视图怎么把消息传递给父视图 这个按钮不灵敏,怎么扩大点击响应区域...Hit-Testing就完美的解决了这个问题,通过检测触摸点是否在相关的视图边界范围内,如果在,就继续递归检测该视图的所有子视图,离用户最近的那个视图的边界如果包含触摸点,那么它就是我们要找的Hit-Test...pointInside:withEvent: 方法来检测point是否在view的边界范围内,如果在view的边界范围内,则返回YES,然后,在子视图中递归调用 hitTest:withEvent:...如果不在范围内,则返回NO,那么它的所有子视图都会被忽略,hitTest:withEvent:返回 nil 。...父视图成为first responder,子视图把事件沿着响应链转发。

    3.6K90

    《Motion Design for iOS》(四十二)

    我们调用super后,就可以在这两个方法中添加任何我们想要的行为。 让我们添加一个Pop动画到 -touchesBegan:withEvent:中去。...如果动画不是已经存在,我们就和平常一样创建一个新的Pop动画对象,设置弹簧的动作属性,比如弹性,设置toValue,然后添加动画到视图或者layer上。...在这个例子中,我们动画了视图的尺寸,所以我们将动画添加到视图上。 现在让我们在触摸事件结束时做同样的事情。这次代码放在 -touchesEnded:withEvent:中。...它基本上和我们已经添加的代码一样,只是重复它,修改动画类型,然后改变toValue值。这里是完整的代码,以及一些注释。...// 当用户开始点击时立即调用 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 看动画是否已经被添加到视图或者

    35310

    iOS14开发-触摸与手势识别

    方法 // 返回一个CGPoint类型的值,表示触摸在view上的位置。 // 返回的位置是针对view的坐标系。 // 调用时传入的view参数为空的话,返回的是触摸点在整个窗口的位置 。...-> Bool { } UIApplication 调用 UIWindow 的hitTest方法将触摸事件传递给 UIWindow,如果 UIWindow 能够响应触摸事件,则调用其子 UIView 的...(默认操作) (2)拦截,事件不再往上传递,重写touchesBegan方法,但不调用父类的touchesBegan方法。...(3)不拦截,事件继续往上传递,重写touchesBegan方法,并调用父类的touchesBegan方法,即super.touchesBegan(touches, with: event)。...使用步骤 创建手势实例,指定回调方法,当手势开始,改变、或结束时,回调方法被调用。 将手势添加到需要的 UIView 上。

    2.3K20

    iOS学习——核心动画

    CAAnimationGroup   CASpringAnimation 3、 简单使用CoreAnimation的步骤 使用CoreAnimation做动画的时候,遵循四步就好 创建CAAnmation子对象...,因为CAAnmation是抽象类,所以一般要使用自具体子类,就是上面说的五类 设置CAAnmation的属性,不同的动画类别属性参数不一样的 调用CALayer的addAnimation:forKey...:将CAAnimation对象添加到CALayer上,就能执行动画 调用CALayer的removeAnimationForKey方法可以停止CALayer中的动画。...观察发现,设置该值,刚开始视图不见,还不知道应用在哪里。...//kCATransitionPush//新视图推出旧视图//kCATransitionReveal//移开旧视图显示新视图//另外,除了系统给的这几种动画效果,我们还可以使用系统私有的动画效果: //

    1.2K50
    领券