首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    3.3.1.寻找最合适的view底层剖析 两个重要的方法: hitTest:withEvent:方法 pointInside:withEvent:方法 3.3.1.1.hitTest:withEvent...,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 拦截事件的处理 正因为hitTest:withEvent:方法可以返回最合适的view,所以可以通过重写hitTest:withEvent...技巧:想让谁成为最合适的view就重写谁自己的父控件的hitTest:withEvent:方法返回指定的子控件,或者重写自己的hitTest:withEvent:方法 return self。...但是,建议在父控件的hitTest:withEvent:中返回子控件作为最合适的view! 原因在于在自己的hitTest:withEvent:方法中返回自己有时候会出现问题。...控制器的view的hitTest:withEvent:方法return nil或者window的hitTest:withEvent:方法return self return nil的含义: hitTest

    11.4K70

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

    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之事件的传递和响应机制-实践篇

    所以,我们可以在hitTest:withEvent:方法里面强制返回父控件为最合适的view,也就是返回红色的view。...注意,不能够重写父控件的hitTest:withEvent:方法,也就是不能够重写红色的view的hitTest:withEvent:方法。...原因在于,如果重写父控件的hitTest:withEvent:方法,并在该方法中返回父控件本身,会导致点击父控件的父控件时,也是父控件为最合适的view。...随后,我又重写了绿色的view的hitTest:withEvent:方法,返回红色的view。但是,点击非重叠区,没响应。...分析:事件的响应是顺着响应者链条向上传递的,即从子控件传递给父控件,touch方法默认不处理事件,而是把事件顺着响应者链条传递给上一个响应者。这样我们就可以依托这个原理,让一个事件多个控件响应。

    8.5K20

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

    手势和pointInSide()以及hitTest()的关系:必须先通过pointInSide()和hitTest()找到的view(即处理事件的view),才能响应view的手势事件。 2....touchesEnded:withEvent:] 事件传递::通过RedView的hitTest()和pointInSide()的调用可知是处理事件的是RedView。...touchesEnded:withEvent:] 事件传递::通过RedView的hitTest()和pointInSide()的调用可知是处理事件的是RedView。...NO表示手势识别出来,不cancel掉view的touch方法的回调 gesture.cancelsTouchesInView = NO; //只是添加了这一行代码!!!!!!!!!!...NO表示手势识别出来,不cancel掉view的touch方法的回调 gesture.cancelsTouchesInView = NO; [redView addGestureRecognizer

    1.1K20

    iOS中的事件的产生和传递

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

    91410

    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

    4.1K10

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

    5.1.4hitTest方法以及不规则区域内触摸事件处理方法 5.1.4.1hitTest:withEvent:方法流程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application...window对象会在首先在view hierarchy的顶级view上调用hitTest:withEvent:,此方法会在视图层级结构中的每个视图上调用pointInside:withEvent:,如果...hitTest:withEvent:方法的处理流程如下: •首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; •若返回NO,则hitTest:withEvent...,直到有子视图返回非空对象或者全部子视图遍历完毕; •若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; •如所有子视图都返回非,则hitTest:withEvent...【原】ios的hitTest方法以及不规则区域内触摸事件处理方法 http://www.cnblogs.com/wengzilin/p/4249847.html hitTest:withEvent:

    1.2K20

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

    不接收用户交互userInteractionEnabled = NO 隐藏hidden = YES 透明alpha = 0.0 ~ 0.01 提示:UIImageView的userInteractionEnabled...就传递给控制器;如果控制器不存在,则将其传递给它的父视图 2).在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 3).如果window对象也不处理...接着就会调用上一个响应者的touches….方法 2.3 模拟系统的hitTest方法原理 /* hitTest : withEvent: 作用:找做合适的view;当事件传递给一个控件的时候调用...*/ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ NSLog(@"%s",__func...__); // [super hitTest:point withEvent:event];//使用系统默认做法 //1、判断自己能否接受事件 if (self.userInteractionEnabled

    97930

    iOS事件响应控制 原

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

    55340

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

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; //判断当前点击事件是否存在最优响应者(First Responder)...- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event; //判断当前点击是否在控件的Bounds之内 视图命中查找流程 1.调用hitTest...:withEvent:); SEL swiSEL = @selector(wcq_hitTest:withEvent:); Method oriMethod = class_getInstanceMethod...3.类似地,视图层次中的每个后续视图如果不处理事件都首先传递给它的视图控制器(如果有的话),然后是它的父视图。 4.最上层的容器视图将事件传递给UIWindow对象。...,然后在调用hitTest: withEvent:依次获取处理这个事件的所有视图对象,在获取所有的可处理事件对象后,开始调用这些对象的touches回调方法 在自定义View中重写 touchesBegan

    2.5K30
    领券