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

为什么hitTest:withEvent:每次触摸调用三次?

这个问题是关于触摸事件处理的问题,具体来说是关于iOS开发中的hitTest:withEvent:方法。这个方法在触摸事件发生时会被调用三次,原因如下:

  1. 首先,hitTest:withEvent:方法是用于确定触摸事件是否发生在当前视图上的。这个方法会递归地遍历视图层级,找到最上层的视图来处理触摸事件。
  2. 其次,hitTest:withEvent:方法会在三个不同的阶段被调用:
  • 当触摸开始时,会调用hitTest:withEvent:方法来确定哪个视图应该接收触摸事件。
  • 当触摸移动时,会再次调用hitTest:withEvent:方法来确定哪个视图应该接收触摸事件。
  • 当触摸结束时,会再次调用hitTest:withEvent:方法来确定哪个视图应该接收触摸事件。
  1. 最后,由于触摸事件的处理是在主线程中进行的,因此在处理触摸事件时需要注意性能问题,避免因为处理触摸事件而导致界面卡顿。

总之,hitTest:withEvent:方法会在触摸事件发生时被调用三次,以确定哪个视图应该接收触摸事件。开发者需要注意性能问题,避免因为处理触摸事件而导致界面卡顿。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象 重写以上四个方法,如果是处理UIView的触摸事件。...参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个...,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 拦截事件的处理 正因为hitTest:withEvent:方法可以返回最合适的view,所以可以通过重写hitTest:withEvent...事件传递给谁,就会调用谁的hitTest:withEvent:方法。...寻找最合适的view告诉系统 // point:当前手指触摸的点 // point:是方法调用者坐标系上的点 - (UIView *)hitTest:(CGPoint)point withEvent:(

11.1K70

iOS中的事件的产生和传递

1.事件的产生 ●发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,为什么是队列而不是栈?...2.3如何寻找最合适的view 两个重要的方法: hitTest:withEvent:方法 pointInside方法 2.4 hitTestwithEvent:方法什么时候调用 只要事件传递给一个控件...,控件就会调用自己的hitTestwithEvent:方法 注 意:不管控件能不能处理事件,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法...●通过重写hitTestwithEvent:,就可以拦截事件的传递过程,想让谁处理事件谁就处理事件。...注 意:如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的view,也就是在自己身上没有找到更合适的view。

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

    withEvent:(UIEvent *)event 触摸结束:- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 触摸取消...如果两根手指同时触摸一个view,那么view只会调用一次 touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象。...如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象 根据touches...接着就会调用上一个响应者的touches….方法 2.3 模拟系统的hitTest方法原理 /* hitTest : withEvent: 作用:找做合适的view;当事件传递给一个控件的时候调用...*/ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ NSLog(@"%s",__func

    94330

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

    5.1.4hitTest方法以及不规则区域内触摸事件处理方法 5.1.4.1hitTest:withEvent:方法流程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application...的事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,window对象首先会使用hitTest:withEvent:方法寻找此次Touch...window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:,此方法会在视图层级结构中的每个视图上调用pointInside:withEvent:,如果...hitTest:withEvent:方法的处理流程如下: •首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; •若返回NO,则hitTest:withEvent...【原】ios的hitTest方法以及不规则区域内触摸事件处理方法 http://www.cnblogs.com/wengzilin/p/4249847.html hitTest:withEvent:

    1.1K20

    事件传递、响应者链条

    )point withEvent:(nullable UIEvent *)event; HitTest的顺序 UIApplication -> UIWindow -> Root View -> subview...UIApplication和UIWindow通过sendEvent:方法传递事件 UIWindow 之后会通过hitTest:withEvent:方法寻找触碰点所在的视图 hitTest:withEvent...:原理 // point是该视图的坐标系上的点 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 1.判断自己能否接收触摸事件...// 没有找到比自己更合适的view return self; } 三、响应者链条 当找到最合适的响应者之后, 便会调用控件相应的touches方法来作具体处理....(即调用super的touches方法),从之前往下走的路线往上回传,在其中加入了Viewtroller来处理 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父View

    88310

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

    事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中,为什么是队列而不是栈?...:(CGPoint)point withEvent:(UIEvent *)event; 3.2 hitTest:withEvent 方法介绍 什么时候调用?...只要事件一传递给一个控件,这个控件就会调用他自己的hitTestwithEvent:方法 作用 寻找并返回最合适的view(能够响应事件的那个最合适的view) 注 意 1.不管这个控件能不能处理事件...,也不管触摸点在不在这个控件上,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 2.如果hitTest:withEvent:方法中返回nil,那么调用该方法的控件本身和其子控件都不是最合适的...3.3 pointInside:withEvent 方法介绍 判断点在不在当前view上(方法调用者的坐标系上)如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上,那么方法调用者也就不能处理事件

    1.2K10

    在一个app中间有一个button,在你手触摸屏幕点击后,到这个button收到点击事件,中间发生了什么

    设备将touch到的UITouch和UIEvent对象打包, 放到当前活动的Application的事件队列中 单例的UIApplication会从事件队列中取出触摸事件并传递给单例UIWindow UIWindow...使用hitTest:withEvent:方法查找touch操作的所在的视图view hitTest:withEvent是如何找到对应的View?...1.首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 2.若返回NO,则hitTest:withEvent:返回nil; 3.若返回YES,则向当前视图的所有子视图发送...hitTest:withEvent:消息,(所有子视图的遍历顺序是从top到bottom,即从subviews数组 的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕); 4.若第一次有子视图返回非空对象...,则hitTest:withEvent:方法返回此对象,处理结束; 5.如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

    1.1K10

    iOS UIButton 点击无响应的解决办法

    解决办法 这里有两个方法,每次有touch动作时,都会走这两个方法 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; - (BOOL...:(UIEvent *)event 这是View里的一个方法,处理流程如下 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 若返回NO,则hitTest:...withEvent:返回nil; 若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从top到bottom,即从subviews...数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕; 若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; 如所有子视图都返回非,则hitTest...最后,这个触摸事件交给主窗口的hitTest:withEvent:方法返回的视图对象去处理。

    3.4K10

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

    每次点击发生的时候,点击对象都放在一个集合中传入UIResponder的回调方法中,我们通过集合中对象获取用户点击的位置。...- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; //判断当前点击是否在控件的Bounds之内 视图命中查找流程 1.调用hitTest...方法内部会调用pointInside方法对点击点进行是否在当前视图bounds内进行判断,如果超出bounds,hitTest则返回nil。...,然后在调用hitTest: withEvent:依次获取处理这个事件的所有视图对象,在获取所有的可处理事件对象后,开始调用这些对象的touches回调方法 在自定义View中重写 touchesBegan...需要注意的是:viewController.m文件中重写touchBegan:withEvent:方法,相当于处理的是viewController的触摸事件,想处理自定义View的触摸事件,必须在自定义

    2.5K30

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

    那么将在每次设置或更改frame的时候自动调用drawRect:。     ...View收到hitTest消息时,会调用自己的pointInside:withEvent:方法,如果pointInside返回YES,则表明触摸事件发生在我自己内部,则会遍历自己的所有Subview去寻找最小单位...6.1.4 hitTest方法以及不规则区域内触摸事件处理方法 6.1.4.1 hitTest:withEvent:方法流程         iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动...window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:,此方法会在视图层级结构中的每个视图上调用pointInside:withEvent:,如果...hitTest:withEvent:方法的处理流程如下:     • 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;     • 若返回NO,则hitTest

    62830

    iOS 事件体系知识及原理小记

    view - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 该方法的主要逻辑是: 检查当前view是否能响应事件(userInteractionEnabled...执行hitTest:withEvent:; 如果subView的hitTest:withEvent:有返回,则返回该返回; 如果subView的hitTest...UITouch;并将UIEvent对象放到当前活跃app的事件队列中; UIApplication会从事件队列中取出最前面的事件进行分发以便处理,通常先发送事件给应用程序的主窗口(UIWindow); 主窗口会调用...hitTest:withEvent:方法在视图(UIView)层次结构中找到一个最合适的UIView来处理触摸事件,并将UITouch与UIEvent交给UIView处理(通过touchesBegan/...(2)事件响应阶段(响应链): 在上面提到的查找阶段,通过hitTest:withEvent:最终查找到的最后view自然就做为第一个可以响应该事件的view,当该view不能处理该事件,系统会通过nextResponder

    1.2K90

    iOS 点击事件如何穿透透明的View?

    -(id)hitTest:(CGPoint)pointwithEvent:(UIEvent *)event { UIView *hitView= [super hitTest:point withEvent...:withEvent:方法的处理流程如下: 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 若返回NO,则hitTest:withEvent:返回nil;...若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕...; 若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; 如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。...- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 1.判断当前控件能否接收事件 if (self.userInteractionEnabled

    4K10

    通过UITouch方法监听View的触摸事件的缺点

    触摸事件 //一根或者多根手指开始触摸view时自动调用view的下面方法 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event...*)event; //触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程时自动调用view的下面方法 - (void)touchesCancelled:(NSSet *)touches withEvent...只会调用一次touchesBegan:withEvent:方法,touches参数中装着2个UITouch对象 如果这两根手指一前一后分开触摸同一个view,那么view会分别调用2次touchesBegan...:withEvent:方法,并且每次调用时的touches参数中只包含一个UITouch对象 所以根据touches中UITouch的个数可以判断出是单点触摸还是多点触摸 4....// 用来寻找最合适的View处理事件,只要一个事件传递给一个控件就会调用控件的hitTest方法,参数point 表示方法调用者坐标系上的点 - (nullable UIView *)hitTest:

    1.7K60

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

    *)touches withEvent:(nullable UIEvent *)event; //一根或者多根手指在view上移动,系统会自动调用view的下面方法(随着手指的移动,会持续调用该方法)...,系统会自动调用view的下面方法 - (void)touchesEnded:(NSSet *)touches withEvent:(nullable UIEvent *)event...hitTest方法首先从顶部UIApplication往下调用(从父类到子类),直到找到命中者,然后从命中者视图沿着响应者链往上传递寻找真正的响应者。...4.1.命中测试 命中测试(hitTest)主要会用到视图类的hitTest函数和pointInside函数。...当触摸事件发生后,系统会将触摸事件以UIEvent的方式加入到UIApplication的事件队列中,UIApplication将事件分发给根部的UIWindow去处理,UIWindow则开始调用hitTest

    1.1K30

    iOS事件响应控制 原

    这一步是什么意思,其实很简单,就是找到你所触摸点对应的那个最上层的视图,它的工作原理是这样的:当用户发出事件后,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理的事件队列中,...UIApplication会取出队列中最前面的事件,发消息给UIWindow,然后UIWindow会对其所有子视图调用hitTest:withEvent:这个方法,这个方法会返回一个UIView的对象,...这个方法在执行的时候,它会调用当前视图的pointInside:withEvent:这个方法,如果触摸事件在当前视图范围内,pointInside:withEvent:会返回YES,否则会返回NO;如果返回...YES,则会遍历当前视图的所有子视图,统统发送hitTest:withEvent:这个消息,如果返回NO,则hitTest:withEvent:方法返回nil; 上面说起来有些绕,其实就是:hitTest...可以证明,在事件视图寻找中,UIImageView我们重写hitTest:withEvent:方法后,切断了寻找链,如果我们这个做: -(UIView *)hitTest:(CGPoint)point

    54640

    ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled...touchesEnded:withEvent:] 事件传递::通过RedView的hitTest()和pointInSide()的调用可知是处理事件的是RedView。...hitTest()和pointInSide()的调用可知是处理事件的是RedView。...所以在后面的触摸事件中,RedView的touchesEnded:withEvent:方法不再会被调用,而是调用CustomerGesture的touchesMoved:withEvent:方法和GestureVC...在整个事件序列中(一个事件序列是:手机触摸屏幕,接着在屏幕滑动,最后手指离开屏幕),RedView的touches开头的4个方法都不会被调用

    1.1K20

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

    对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图(最合适来处理的控件),这个过程称之为hit-test view...view:事件传递给控件的时候, 就会调用该方法,去寻找最合适的view并返回看可以响应的view - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent...point toView:childView]; // 3.3判断是否在在子控件中找到了更合适的子控件(递归循环) UIView *fitView = [childView hitTest...NO,point参数必须是方法调用者的坐标系....(即调用super的touches方法) 谁是上一个响应者? 1\. 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 2\.

    81731
    领券