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

如何忽略触摸事件并将它们传递给另一个子视图的UIControl对象?

要忽略触摸事件并将它们传递给另一个子视图的UIControl对象,您可以遵循以下步骤:

  1. 首先,确保您的UIControl对象已经添加到视图层次结构中。
  2. 在UIControl对象的代码中,重写hitTest(_:with:)方法。这个方法用于确定哪个视图应该接收触摸事件。在这个方法中,您可以返回nil,这将忽略触摸事件。
  3. 在UIControl对象的代码中,重写touchesBegan(_:with:)touchesMoved(_:with:)touchesEnded(_:with:)touchesCancelled(_:with:)方法。在这些方法中,您可以将触摸事件传递给另一个子视图。

例如:

代码语言:swift
复制
class MyUIControl: UIControl {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        // 忽略触摸事件
        return nil
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 将触摸事件传递给另一个子视图
        let anotherSubview = self.superview?.subviews.first(where: { $0 is AnotherSubview }) as? AnotherSubview
        anotherSubview?.touchesBegan(touches, with: event)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 将触摸事件传递给另一个子视图
        let anotherSubview = self.superview?.subviews.first(where: { $0 is AnotherSubview }) as? AnotherSubview
        anotherSubview?.touchesMoved(touches, with: event)
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 将触摸事件传递给另一个子视图
        let anotherSubview = self.superview?.subviews.first(where: { $0 is AnotherSubview }) as? AnotherSubview
        anotherSubview?.touchesEnded(touches, with: event)
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        // 将触摸事件传递给另一个子视图
        let anotherSubview = self.superview?.subviews.first(where: { $0 is AnotherSubview }) as? AnotherSubview
        anotherSubview?.touchesCancelled(touches, with: event)
    }
}

这样,当MyUIControl对象接收到触摸事件时,它将忽略这些事件并将它们传递给另一个子视图(在这个例子中是AnotherSubview)。

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

相关·内容

iOS 中的事件响应

当用户在 UIScrollView 的一个子视图上按下时,UIScrollView并不知道用户是想要滑动内容视图还是点击对应子视图,所以在按下的一瞬间, 事件 UIEvent 从 UIApplication...:inContentView:方法询问是否将事件传递给对应的子视图 (如果返回 NO, 则该事件不会传递给对应的子视图,如果返回 YES,则该事件会传递给对应的子视图,默认为 YES); 当事件被传递给子视图后...var delaysContentTouches: Bool // 是否可以取消内容视图被触摸,默认为YES,如果设置为NO,则一旦开始跟踪事件,即使手指进行移动也不会取消已经传递给子视图的事件,即滚动视图不会再滚动...open var canCancelContentTouches: Bool // 在UIScrollView的子类中重写该方法,用于返回是否将事件传递给对应的子视图,默认返回YES,如果返回NO,该事件不会传递给对应的子视图..., in view: UIView) -> Bool // 在UIScrollView的子类中重写该方法,用于返回是否取消已经传递给子视图的事件,默认当子视图是UIControl时返回NO,否则返回YES

2.8K11

事件传递、响应者链条

的对象称之为响应者对象,能够处理touchesBegan等触摸事件 当一个Touch事件产生时,要先找到响应者,iOS通过Hit-Test机制来寻找响应者,每一个UIView(继承自UIResponder...:原理 // point是该视图的坐标系上的点 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 1.判断自己能否接收触摸事件...并将该事件随着响应者链条往回传递, 交给上一个响应者来处理....(即调用super的touches方法),从之前往下走的路线往上回传,在其中加入了Viewtroller来处理 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父View...在视图层次结构的最顶级视图,传递给ViewController ViewController将事件传递给window对象进行处理 window对象继续将事件或消息传递给UIApplication

89010
  • UIControl-IOS开发

    控件是对UIView派生类的有用增强及补充,并能够直接附着于导航栏、表格单元,甚至更大的对象。...这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每一个控件都有非常多视图的特性,包含附着于其它视图的能力。全部 控件都拥有一套共同的属性和方法。...所以学习控件,我们先学习UIControl 属性 enabled 控件默认是启用的。要禁用控件,能够将enabled属性设置为NO,这将导致控件忽略不论什么触摸事件。...下列事件为基类UIControl所支持,除非另有说明,也适用于全部控件 UIControlEventTouchDown 单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。...要删除一个或多个事件的对应动作,能够使用UIControl类的removeTarget方法。

    58820

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

    我们熟悉的 UIApplication、 UIViewController、 UIWindow 和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象.... 2.响应过程 iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的...UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图(最合适来处理的控件)...在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件传递给window对象进行处理 3\....如果window对象也不处理,则其将事件或消息传递给UIApplication对象 4\.

    85631

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

    4.2.响应者链条示意图 响应者链条:在iOS程序中无论是最后面的UIWindow还是最前面的某个按钮,它们的摆放是有前后关系的,一个控件可以放到另一个控件上面或下面,那么用户点击某个控件时是触发上面的控件还是下面的控件呢...如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图 2>在视图层次结构的最顶级视图...2.UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序的主窗口(keyWindow)。   3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。...controller,首先判断视图控制器的根视图view是否能处理此事件;如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传 递;(对于第二个图视图控制器本身还在另一个视图控制器中,...;就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者的touches….方法 如何做到一个事件多个对象处理: 因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches

    11.4K70

    iOS14开发-触摸与手势识别

    UIResponder 响应者对象。 只有继承了 UIResponder 的对象才能接收并处理触摸事件。...AppDelegate、UIApplication、UIWindow、UIViewController、UIView 都继承自 UIResponder,因此它们都是响应者对象,都能够接收并处理触摸事件。...遍历每一个子 UIView 时,都会重复上面的操作(判断能否响应触摸事件,能则继续遍历子 UIView,直到找到一个 UIView)直到找到最合适的 UIView。...-> Bool { } UIApplication 调用 UIWindow 的hitTest方法将触摸事件传递给 UIWindow,如果 UIWindow 能够响应触摸事件,则调用其子 UIView 的...继承自 UIControl 的 UIView 都可以通过 Target-Action 方式添加事件,如果同时给它们添加手势识别, 则 Target-Action 的行为会失效,因为手势识别的优先级更高。

    2.3K20

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

    ,iPhone OS会将它识别为一组触摸对象,并将它们封装在UITouch和UIEvent形式的实例,消息循环(runloop)会接收到触摸事件并放入当前应用程序的事件队列中。...UIView对象并不一定会把事件传递给每一个子view,因为UIView是通过hitTest方法来判断点击事件发生在哪个子view上面的,会采用逆序查询也就是优先查询后加载的子试图,这样做也是为了优化查找速度...——>redview对象 //************华丽分割线 便于阅读*********** 事件的传递其实就是在事件产生与分发之后如何寻找最优响应视图的一个过程。...如果第一响应者没有进行处理,第一响应者将事件将处理事件的责任传递给下一个,更高级的对象,即当前responder对象的nextResponder。...3.类似地,视图层次中的每个后续视图如果不处理事件都首先传递给它的视图控制器(如果有的话),然后是它的父视图。 4.最上层的容器视图将事件传递给UIWindow对象。

    2.5K30

    Android触摸事件机制

    所谓触摸事件的分发,实际上可以理解为MotionEvent事件的分发过程,即当一个MotionEvent产生了之后,系统需要把这个事件传递给一个具体的View,而这个传递的过程就是分发过程。...接下来触摸事件ev会传递给Activity窗口绑定的根视图rootView(View/ViewGroup),如果根视图也有子视图,事件ev会一级一级的分发下去,如果在这个过程中ev被消耗了,事件就此结束分发...它将屏幕分成两部分,一个是TitleView,另一个是ContentView(也就是大家熟悉的ContentView布局)。...从中我们看出触摸事件ev会按照子View加入ViewGroup先后顺序相反的顺序,依次有机会去消费此触摸事件ev,即最后加入的最先有机会消费此触摸事件(消费的前提是,触摸点在这个子View的视图范围之内...,继续下一步流程; onTouchEvent() 返回true表示事件被处理了,不用传递给上一级视图; 返回false表示事件交给上一级视图处理; 初始情况下他们的默认返回值都为false。

    72830

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

    4.2 响应者链条 在iOS程序中无论是最后面的UIWindow还是最前面的某个按钮,它们的摆放是有前后关系的,一个控件可以放到另一个控件上面或下面,那么用户点击某个控件时是触发上面的控件还是下面的控件呢...view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图 2 在视图层次结构的最顶级视图...,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 3 如果window对象也不处理,则其将事件或消息传递给UIApplication对象 4 如果UIApplication...2.UIApplication会从事件队列中取出最前面的事件,把事件传递给应用程序的主窗口(keyWindow)。 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。...如何做到一个事件多个对象处理: 因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己的touches方法和父控件的touches方法来达到一个事件多个对象处理的目的。

    1.2K10

    可能是讲解Android事件分发最好的文章

    我就遇到过这样的时候,当时我很想有一篇文章能简单地解释触摸事件是怎样在视图层次(view hierarchy)中传播的,从而可以将之作为进一步深入学习的起点。...当我们说到“手势剩余部分”时指的是手势后续的MOVE事件和最后的UP或CANCEL事件。 在这里我也不考虑多点触摸手势(我们只假设用一个手指)并且忽略多个MOVE事件可以被归为一组这一实际情况。...我们将要讨论的视图层次是这样的:最外层是一个ViewGroup A,包含一个或多个子view(children),其中一个子view是ViewGroup B,ViewGroupB中又包含一个或多个子view...这里我们忽略同层级view之间可能的交叉叠加。 ? 假设用户首先触摸到的屏幕上的点是C上的某个点,该点被标记为触摸点(touch point),DOWN事件就在该点产生。...另一方面,如果ViewGroup拦截了一个半路的事件(比如,MOVE),这个事件将会被系统变成一个CANCEL事件,并传递给之前处理该手势(gesture)的子View,而且不会再传递(无论是被拦截的MOVE

    62520

    View编程指南

    使用Interface Builder,您可以组装view并将它们放置在一个nib文件中,该文件是存储view和其他对象的冻干版本的资源文件。...当在特定view内发生触摸时,系统将带有触摸信息的事件对象直接发送到该view进行处理。但是,如果view不处理特定的触摸事件,它可以将事件对象传递给其superview。...如果superview不处理事件,它将事件对象传递给它的superview,等等这样一个响应者链。特定的view也可以将事件对象传递给介入的响应者对象,如viewcontroller。...UIKit框架将触摸包装到UIEvent对象中并将其分派到相应的View。 view的事件处理代码响应事件。...不要通过嵌入subview来自定义控件 虽然在技术上可以将subview添加到标准系统控件(从UIControl继承的对象),但不应该以这种方式定制它们。

    2.3K20

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

    2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件...,那么子控件就不可能接收到触摸事件(掌握) 如何找到最合适的控件来处理事件?...;就会将事件顺着响应者链条往上传递,传递给上一个响应者 4> 接着就会调用上一个响应者的touches….方法 如何判断上一个响应者 1> 如果当前这个view是控制器的view,那么控制器就是上一个响应者...2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者 响应者链的事件传递过程 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图 在视图层次结构的最顶级视图...,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,则其将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息

    97670

    Android下的Touch事件分发详解

    具体来说,当一个触摸事件产生时,首先会传递给 Activity 的 dispatchTouchEvent 方法,然后由 Activity 将事件传递给 Window,最后由 Window 将事件传递给顶层的...当 Touch 事件发生时,事件首先传递给最外层的 Activity,然后通过dispatchTouchEvent方法沿着视图层次结构逐级向内传递给子视图。...整个事件传递过程可以概括为:首先通过隧道方式自上而下地传递事件,然后在未被消费的情况下通过冒泡方式自下而上地回传事件。这种机制允许开发者在不同层次的视图中灵活地处理事件,实现复杂的交互效果。...同时,这种机制也有助于提高事件处理的效率,因为在事件被拦截或消费后,事件将不再继续传递或回传,从而减少了不必要的计算开销。 3.2 时序图 时序图描述了 Touch 事件在视图层次结构中的传递过程。...它们的调用顺序和返回值决定了事件是如何在视图层次结构中传递的。下面我们用伪代码来分析如何实现隧道方式和冒泡方式。

    36010

    IOS触摸事件分发机制详解

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

    3.6K90

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

    当发生屏幕旋转事件的时候,UIapplication对象会将旋转事件传递给uiwindow,uiwindow又会将旋转事件传递给它的根控制器,由根控制器决定是否需要旋转UIapplication->uiwindow...如果这个点位于接收者之外就返回nil 讨论         这个方法贯穿视图的层次发送pointInside:withEvent:消息到每一个子视图用来决定那个子视图需要接收触摸事件。...Application的事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件的窗口)处理,window对象首先会使用hitTest:withEvent...:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,称之为hit-test view。         ...如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds属性为NO,这样超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图在父视图之外区域的触摸操作不会被识别

    70830

    手把手教你读懂源码,View的Touch事件传递流程详细剖析

    如果event为空,则将动作设为ACTION_CANCEL,接着用一个for循环不断向下传递触摸事件,然后再清除所有触摸目标,最后在回收拷贝的对象。...如点击的地方有两个子View都包含点击事件的坐标,那么后被添加到布局中的那个子view会先响应事件,即点击的时候最上层的那个组件先去响应该事件。...canViewReceivePointerEvents方法 该方法用于判断当前视图的状态,只有其正在显示或正在执行动画,才可以接受触摸事件。 ?...isTransformedTouchPointInView方法 判断视图有scrollTo或scrollBy造成的滚动偏移也需要计算在内,并判断触摸点是否在当前子视图内。...方法中child为null的情况;如果之前的ACTION_DOWN事件被子View消费掉了,就会直接找到该子View对应的Target,将ACTION_MOVE和ACTION_UP事件传递给它们。

    92970

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

    我们称之为“响应者对象” UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 1.1 事件可以分为三大类型...事件的产生和传递 4.1 事件产生和传递过程 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理...,通常,先发送事件给应用程序的主窗口(keyWindow) 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches...方法来作具体的事件处理 4.2 那么主窗口如何找到最合适的控件来处理事件?...如果控制器不存在,其父视图为上一个响应者,将其传递给它的父视图 在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,

    1.7K60

    跟iOS UI的捉迷藏(如何获取用户点击行为的控件title)

    乍一听,熟悉Android的同学会说, View的onClick事件监听就好了,然而,iOS与Android并不相同,一方面,iOS没有统一的获取title的方式,另一方面,不同UI控件title的位置不尽相同...1.如何获取用户控件的点击行为 事实上,由于获取的“所见所得”点击view行为,所以,思路上应该是对uiview或者及其子类得某个事件方法hook到,这样触发点击(广义上是触摸)行为后,可以根据发送的事件确定点击的...根据上文可知,当UIControl监听到需要处理的交互事件时,会调用 sendAction:to:forEvent: 将target、action以及event对象发送给全局应用,Application...这里我们用第一个,sendAction:to:forEvent: 里面有三个参数,最后一个是event,可以通过allTouches方法,可以获得触摸点的集合,可以判断多点触摸事件 而touch.view...进行判断,并获取title了 触摸事件参考文章:https://www.cnblogs.com/syxchina/archive/2012/10/14/2723541.html 2.如何获取不同控件的title

    1.4K10
    领券