首页
学习
活动
专区
工具
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.7K11

事件传递、响应者链条

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

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

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

    81731

    UIControl-IOS开发

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

    58620

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

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

    11.1K70

    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。

    72730

    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

    61620

    View编程指南

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

    2.3K20

    Android事件分发机制详解

    当我们说到“手势剩余部分”时指的是手势后续MOVE事件和最后UP或CANCEL事件。 在这里我也不考虑多点触摸手势(我们只假设用一个手指)并且忽略多个MOVE事件可以被归为一组这一实际情况。...我们将要讨论视图层次是这样:最外层是一个ViewGroup A,包含一个或多个子view(children),其中一个子view是ViewGroup B,ViewGroupB中又包含一个或多个子view...这里我们忽略同层级view之间可能交叉叠加。 ? 假设用户首先触摸屏幕上点是C上某个点,该点被标记为触摸点(touch point),DOWN事件就在该点产生。...假如DOWN事件传给ConTouchEvent方法时,它返回了false,DOWN事件会继续向上传递给B和AonTouchEvent,即使它们在onInterceptTouchEvent方法中说它们不想拦截这个...另一方面,如果ViewGroup拦截了一个半路事件(比如,MOVE),这个事件将会被系统变成一个CANCEL事件,并传递给之前处理该手势(gesture)子View,而且不会再传递(无论是被拦截MOVE

    97931

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

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

    97270

    Android下Touch事件分发详解

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

    25510

    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区域视图内容也会显示),那么正常情况下对子视图在父视图之外区域触摸操作不会被识别

    62830

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

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

    86570

    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
    领券