首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏KyXu

    【iOS 开发】父视图外部子视图点击响应 - hitTest

    Code Snippet 完整 Demo Github 地址 至此都是很简单的内容,需要注意的如下: 你会发现 FatherView 里面的这个 HitTest 会被频繁执行, 你随便点击一个空白处,这个方法都会执行,这必然带来性能消耗,这也是 Apple 默认不使用这个方式的原因之一吧 HitTest 会使得我们的蓝色的 UIView 可以相应点击, 如果把需要执行的方法写在了 HitTest 里面,写在 return result 之前的话,我发现这些方法会多执行一次(在我当前写的这个简单 demo 里,我发现点击任意地方,HitTest 方法都会连续执行两次) 延伸阅读 - 深入浅出 iOS 事件机制

    1.4K20发布于 2019-04-11
  • 来自专栏全栈程序员必看

    第10月第28天 touchesBegan hittest「建议收藏」

    nextResponder] touchesEnded:touches withEvent:event]; [super touchesEnded:touches withEvent:event]; } 2.hittest - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = [super hitTest

    26810编辑于 2022-09-15
  • 来自专栏全栈程序员必看

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

    ios事件-触摸事件2(手势 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled 手势和pointInSide()以及hitTest()的关系:必须先通过pointInSide()和hitTest()找到的view(即处理事件的view),才能响应view的手势事件。 2. 通过hitTest()、pointInSide()找到的view,那么view和它的superView的手势都能响应,但不会响应它的子view的手势。 3. - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { NSLog(@"%@, %s", self.bgColorString CustomerGesture继承UIPanGestureRecognizer, 点击一下红色按钮,输出结果如下: redColorView, -[RedView hitTest:withEvent:

    1.4K20编辑于 2022-09-15
  • 来自专栏acoolgiser_zhuanlan

    MFC树点击事件中CTreeCtrl::HitTest用法以及uFlag参数的不同值的含义

    CTreeCtrl::HitTest的语法结构: ​​​​​​​ HTREEITEM HitTest( CPoint pt, UINT* pFlags = NULL ) const ; HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo ) const;  参数的取值及含义: Value 含义 TVHT_ABOVE 在客户端区域。 GetCursorPos(&pt);    //得到光标位置     this->ScreenToClient(&pt);     UINT uFlag;     HTREEITEM hItem = this->HitTest GetCursorPos(&pt);     m_wndFileView.ScreenToClient(&pt);     UINT uFlag;     HTREEITEM hItem = m_wndFileView.HitTest

    2.4K50发布于 2019-01-17
  • 来自专栏全栈程序员必看

    ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()的关系)

    ios事件-触摸事件3(UIButton 和 pointInSide()、hitTest()、touchesBegan()、touchesMoved()、touchesEnded()、touchesCancelled @end //--------分隔符,分隔.h文件和.m文件------------- @implementation ButtonVC /** 1、button的点击和pointInSide()、hitTest ()的关系:在button的hitTest()中返回button实例,这个button才能响应事件 2、button不同事件的识别,也是通过touchesBegan()、touchesMoved()、 { NSLog(@"%s", __func__); return [super pointInside:point withEvent:event]; } - (UIView *)hitTest :(CGPoint)point withEvent:(UIEvent *)event { NSLog(@"%s", __func__); return [super hitTest

    86720编辑于 2022-09-15
  • 来自专栏日常技术分享

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

    -(id)hitTest:(CGPoint)pointwithEvent:(UIEvent *)event { UIView *hitView= [super hitTest:point withEvent (hitView== self) { return nil; } else { return hitView; } } 扩展 hitTest :withEvent:方法的处理流程如下: 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 若返回NO,则hitTest:withEvent:返回nil; ; 若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; 如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。 self convertPoint:point toView:childView]; // 寻找到最合适的view UIView *fitView = [childView hitTest

    4.5K10发布于 2020-06-16
  • 来自专栏日常技术分享

    在一个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.3K10发布于 2018-09-13
  • 来自专栏云原生布道专栏

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

    5.1.4hitTest方法以及不规则区域内触摸事件处理方法 5.1.4.1hitTest:withEvent:方法流程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application hitTest:withEvent:方法的处理流程如下: •首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; •若返回NO,则hitTest:withEvent ,直到有子视图返回非空对象或者全部子视图遍历完毕; •若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束; •如所有子视图都返回非,则hitTest:withEvent 【原】ios的hitTest方法以及不规则区域内触摸事件处理方法 http://www.cnblogs.com/wengzilin/p/4249847.html hitTest:withEvent: 方法流程 http://blog.csdn.net/jiajiayouba/article/details/23447145 5.1.4.2使用hitTest自定义响应事件 1、hitTest Hacking

    2.1K20编辑于 2022-03-08
  • 来自专栏半行代码

    Flutter触摸事件原理

    hitTest 会执行 RenderBinding 的 hitTest 方法,执行 renderView 的 hitTest 方法: @override void hitTest(HitTestResult true; } 如果有子节点,会先执行子节点的 hitTesthitTest(result, position: transformed!) 如果没有命中,就用子节点的兄弟节点去执行 hitTest,依次遍历执行。 当 hitTest 的结果不存在的时候,会执行 pointerRouter 的 route 方法。否则会把 hitTest 收集到的组件都执行一次 handleEvent 方法。

    1.7K20编辑于 2022-05-10
  • 来自专栏移动开发之家

    Flutter完整开发实战详解(十三、全面深入触摸和滑动原理)

    GestureBinding 的 hitTest 。 那么这两个 hitTest 又分别干了什么事呢? 1.2、RendererBinding.hitTest 在 RendererBinding.hitTest 中会执行 renderView.hitTest(result, position: position ); ,如下代码所示,renderView.hitTest 方法内会执行 child.hitTest ,它将尝试将符合条件的 child 控件添加到 HitTestResult 里,最后把自己添加进去。 true; } 而查看 child.hitTest 方法源码,如下所示,RenderObjcet 中的hitTest ,会通过 _size.contains 判断自己是否属于响应区域,确认响应后执行

    2K30发布于 2019-05-15
  • 来自专栏TechBox

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

    ,事件都会先传递给这个控件,随后再调用hitTest:withEvent:方法 拦截事件的处理 正因为hitTest:withEvent:方法可以返回最合适的view,所以可以通过重写hitTest:withEvent 不管点击哪里,最合适的view都是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

    12.7K71发布于 2018-06-05
  • 来自专栏iOS 开发

    扩大button点击区域

    onceToken; dispatch_once(&onceToken, ^{ ESSwizzleInstanceMethod([self class], @selector(hitTest :withEvent:), @selector(es_hitTest:withEvent:)); }); } - (void)setTouchEdge:(UIEdgeInsets)edge { self.frw_edge = edge; } #pragma mark - overload - (UIView *)es_hitTest:(CGPoint)point withEvent { if (UIEdgeInsetsEqualToEdgeInsets(self.frw_edge, UIEdgeInsetsZero)) { return [self es_hitTest :center withEvent:event]; } else { return [self es_hitTest:point withEvent:event];

    1.6K20发布于 2020-01-15
  • 来自专栏Helloted

    事件传递、响应者链条

    等触摸事件 当一个Touch事件产生时,要先找到响应者,iOS通过Hit-Test机制来寻找响应者,每一个UIView(继承自UIResponder)都有以下的方法 - (nullable UIView *)hitTest :(CGPoint)point withEvent:(nullable UIEvent *)event; HitTest的顺序 UIApplication -> UIWindow -> Root View UIApplication和UIWindow通过sendEvent:方法传递事件 UIWindow 之后会通过hitTest:withEvent:方法寻找触碰点所在的视图 hitTest:withEvent :原理 // point是该视图的坐标系上的点 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 1.判断自己能否接收触摸事件 CGPoint childPoint = [self convertPoint:point toView:childView]; UIView *fitView = [childView hitTest

    1.4K10编辑于 2022-06-06
  • 来自专栏MelonTeam专栏

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

    & alpha >0.01) 不满足直接返回nil; 通过pointInside:withEvent:方法,检查当前点击是否落在当前view中; 如果点击落在当前view中,遍历subView执行hitTest :withEvent:; 如果subView的hitTest:withEvent:有返回,则返回该返回; 如果subView的hitTest:withEvent 返回,因为view 2满足了两个条件: 通过hitTest找到了view 2 view 2内部没有其他子view ? 再看看另一个特殊的场景: view 2还是view 1的子view;但当一个点击落在view 2的区域内时,查找还是从UIWindow开始,但在view 1的hitTest中就返回了nil,因为点击区域不在 view 1中,导致view 1的子view都不会再进行hitTest;这点跟web中的事件处理是截然不同的;这也导致一些超边界的点击必须由业务去重载hitText方法。

    1.5K90发布于 2018-01-04
  • 来自专栏移动端开发

    事件分发机制

    20160912134713336-1609212026.png 下面就说说我们这个hit-Testing,在UIView中,有这样两个需要你特别注意的方法; - (nullable UIView *)hitTest point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds 我们来说一下,说说 hitTest 2:View1 和 View2 都是 RootView 的子视图,都会接收到 hitTest 消息,但记得遍历的顺序是从上到下,所以先判断 View1 界面,这时候调用 View1 的pointInside :point withEvent:event]; } } else { return [super hitTest:point withEvent 上面就是hitTest的一些概念和简单的使用,其实它能做的事还是挺多的,我把自己学习的笔记链接全都整理出来给; iOS事件分发机制(一) hit-Testing 技术哥 iOS事件分发机制(二)The

    1.4K80发布于 2018-01-09
  • 来自专栏iOS开发~

    iOS_Responder chain 响应链

    (FIFO) UIApplication将出入任务队列最前端的事件向下传递, 传递给UIWindow UIWindow将事件向下传递给RootVC RootVC将事件向下传递给View 调用View的hitTest (子视图返回非空对象) 若subViews中都没有返回对象, 则该view及为时间的响应者(子视图遍历完毕) ---- Hit-Test方法伪实现如下: override func hitTest(_ { print("hitTest: \(self)") /// 1. 倒序遍历子视图, 递归调用hitTest for subview in subviews.reversed() { let subPoint = self.convert(point , to: subview) /// 首个非空子视图, 即为 first responder if let fitView = subview.hitTest(subPoint

    54830编辑于 2022-10-28
  • 来自专栏日常技术分享

    ios Hit-Test

    UIApplication 获取到Event之后,Application就纠结于到底要把这个事件传递给那个View来响应这个事件,这时候就要依靠HitTest来决定了。 iOS中,Hit-Test的作用就是找出这个触摸点下面的View是什么,HitTest会检测这个点击的点是不是发生在这个View上,如果是的话,就会去遍历这个View的subviews,直到找到最小的能够处理事件的 C内,即C的pointInside:withEvent:返回YES;这时候有D和E两个分支:点击的范围再D view内,因此D view的pointInside:withEvent:返回YES,对应的hitTest withEvent:返回DView; 代码验证 新建一个BaseView基类 #import "BaseView.h" @implementation BaseView - (UIView *)hitTest Demo:https://github.com/destinyzhao/HitTest

    1.6K40发布于 2018-09-13
  • 来自专栏TechBox

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

    所以,我们可以在hitTest:withEvent:方法里面强制返回父控件为最合适的view,也就是返回红色的view。 注意,不能够重写父控件的hitTest:withEvent:方法,也就是不能够重写红色的view的hitTest:withEvent:方法。 原因在于,如果重写父控件的hitTest:withEvent:方法,并在该方法中返回父控件本身,会导致点击父控件的父控件时,也是父控件为最合适的view。 我起初尝试重写红色的view的hitTest:withEvent:方法,返回红色的view为最合适的view。虽然可以解决问题,但是点击其他任何地方,也是红色的view响应事件。 随后,我又重写了绿色的view的hitTest:withEvent:方法,返回红色的view。但是,点击非重叠区,没响应。

    8.8K20发布于 2018-06-05
  • 来自专栏落影的专栏

    iOS 事件传递和处理

    motion事件不需要hitTest,touch事件也有部分不需要hitTest,比如说touch结束触发的事件。 ? 方法默认会调用所有子视图的hitTest方法,如果有一个返回。 ,hitTest方法会接着调用UIWindow子视图的hitTest方法。 b1.如果子视图hitTest方法如果有返回视图,则UIWindow的hitTest方法会返回该视图; b2.如果所有子视图hitTest方法都没有返回视图,则UIWindow的hitTest方法会返回自己 UIWindow是UIView的子类,UIView的hitTest方法实现和上述过程一致。 思考: UIView在调用子视图hitTest时,是先调用哪些子视图?

    2.1K20发布于 2021-05-06
  • 来自专栏Alice

    07_事件的传递机制

    可以在view1中重写hitTest方法,在这里直接拦截返回self,这样的话view5便不会响应事件了,但是与此同时view1的子view也不会响应事件了。 所以最好是再view5上边在嵌套一个view -(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ // 如果在当前 view 要想让a响应橙色区域,那么就要重写父视图的pointinside或者hitTest方法,让pointInside返回yes或者让hitTest返回橙色的view - (UIView *)hitTest: 转换坐标系 使坐标基于子视图 CGPoint newPoint = [self convertPoint:point toView:subview]; // 得到子视图 hitTest 方法返回的值 UIView * view = [subview hitTest:newPoint withEvent:event]; // 如果子视图返回一个view

    82410发布于 2020-12-16
领券