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

如何防止传递给UIView的超级视图的触摸事件?

防止传递给UIView的超级视图的触摸事件,可以通过以下方法实现:

  1. 使用UIGestureRecognizer:

UIGestureRecognizer是一个基类,用于处理各种手势,例如点击、滑动、捏合等。可以使用UITapGestureRecognizer来处理点击事件。

代码语言:swift
复制
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
tapGesture.cancelsTouchesInView = false
view.addGestureRecognizer(tapGesture)

@objc func viewTapped(sender: UITapGestureRecognizer) {
    // 处理触摸事件
}
  1. 重写UIView的hitTest方法:

hitTest方法用于确定哪个视图应该接收触摸事件。可以通过重写hitTest方法来防止传递给超级视图的触摸事件。

代码语言:swift
复制
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    let hitView = super.hitTest(point, with: event)
    if hitView == self {
        return nil
    }
    return hitView
}
  1. 使用UIControl的isUserInteractionEnabled属性:

UIControl是UIView的子类,用于处理用户交互事件,例如按钮、滑块等。可以通过设置isUserInteractionEnabled属性为false来禁用视图上的交互事件。

代码语言:swift
复制
view.isUserInteractionEnabled = false
  1. 使用UIWindow的gestureRecognizers属性:

UIWindow是UIView的子类,用于显示应用程序的用户界面。可以通过添加一个UITapGestureRecognizer来处理点击事件,并将cancelsTouchesInView属性设置为false,以防止传递给超级视图的触摸事件。

代码语言:swift
复制
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
tapGesture.cancelsTouchesInView = false
window.addGestureRecognizer(tapGesture)

@objc func viewTapped(sender: UITapGestureRecognizer) {
    // 处理触摸事件
}

总之,防止传递给UIView的超级视图的触摸事件可以通过多种方法实现,具体方法的选择取决于应用程序的需求和场景。

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

相关·内容

事件传递、响应者链条

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

87010

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

我们只能通过子类继承父类,重写子类方法方式处理UIView触摸事件(注意:我说UIView触摸事件而不是说 UIViewController触摸事件)。...所以,还是那句话,想处理UIView触摸事件,必须自定义UIView子类继承自UIView。 2.1.UIView拖拽 那么,如何实现UIView拖拽呢?...如果当前view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么父视图就是当前view上一个响应者,事件就传递给视图 2>在视图层次结构最顶级视图...2.UIApplication会从事件队列中取出最前面的事件,把事件递给应用程序主窗口(keyWindow)。   3.主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件。...;就会将事件顺着响应者链条往上传递,传递给上一个响应者;接着就会调用上一个响应者touches….方法 如何做到一个事件多个对象处理: 因为系统默认做法是把事件上抛给父控件,所以可以通过重写自己touches

10.8K70

iOS 中事件响应

/// 返回触摸对象指定视图坐标 func location(in: UIView?)...: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.6K11

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

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

96070

iOS中手势应用1. 四类事件主要方法2. 响应者链3. 手势识别功能(Gesture Recognizer)4. 手势使用

1.1 触摸事件 触摸事件分成了四部分:开始、移动、结束、取消。...最终找到这个干活控件,我们学术上就叫做第一响应者对象。找到了负责处理按钮之后如何给出相应处理呢?大概过程就是这样: button尝试处理事件。如果它不能处理事件,则将事件递给其父视图。...button视图(superview)尝试处理事件。如果这个父视图还不能处理事件,则继续将视图继续往上级。 上层视图(topmost view)会尝试处理事件。...如果这个上层视图还是不能处理事件,则将事件递给视图所在视图控制器。 视图控制器会尝试处理事件。如果这个视图控制器不能处理事件,则将事件递给窗口(window)对象。...方法监听view触摸事件,有很明显几个缺点 必须得自定义view 由于是在view内部touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view触摸事件 不容易区分用户具体手势行为

2.2K40

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

iOS中几种常见事件 ? 这篇文章只讨论触摸事件。...UIView对象并不一定会把事件递给每一个子view,因为UIView是通过hitTest方法来判断点击事件发生在哪个子view上面的,会采用逆序查询也就是优先查询后加载子试图,这样做也是为了优化查找速度...——>redview对象 //************华丽分割线 便于阅读*********** 事件传递其实就是在事件产生与分发之后如何寻找最优响应视图一个过程。...第一响应者是应用程序中当前负责接收触摸事件响应者对象(通常是一个UIView对象)。...3.类似地,视图层次中每个后续视图如果不处理事件都首先传递给视图控制器(如果有的话),然后是它视图。 4.最上层容器视图事件递给UIWindow对象。

2.4K30

IOS触摸事件分发机制详解

前言 很多时候大家都不关心IOS触摸事件分发机制实现原理,当遇到以下几种情形时候你很可能抓破头皮都找不到解决方案: 某个点击消息由父视图来处理,子视图怎么把消息传递给视图 这个按钮不灵敏,怎么扩大点击响应区域...怎么在一个页面处理手绘、表情拖动放缩、文本编辑三种消息 阅读本文,你会明白两个问题:IOS如何找到响应者、响应者是如何做出响应,明白这两个问题你就能解决类似上述疑难杂症。...Hit-Testing就完美的解决了这个问题,通过检测触摸点是否在相关视图边界范围内,如果在,就继续递归检测该视图所有子视图,离用户最近那个视图边界如果包含触摸点,那么它就是我们要找Hit-Test...会将事件递给响应链中下一个响应者。...下图描述了两个不同事件传递路径(因为不同app设置),一个App事件传递路径由app特殊构成决定,但事件传递路径会遵守相同规则。以下图片很能说明响应链是如何传递。 ?

3.5K90

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

(keyWindow) 主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,但是这仅仅是整个事件处理过程第一步 找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理 touchesBegan...… touchesMoved… touchedEnded… 1.3 UIView不接收触摸事件三种情况 不接收用户交互userInteractionEnabled = NO 隐藏hidden =...II 响应者链事件传递过程 1).如果view控制器存在,就传递给控制器;如果控制器不存在,则将其传递给视图 2).在视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件或消息传递给...2.1 触摸事件处理详细过程 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 找到最合适视图控件后,就会调用控件touches方法来作具体事件处理...touchesBegan… touchesMoved… touchedEnded… 这些touches方法默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理 这里写图片描述 如何判断上一个响应者

91230

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

,通常,先发送事件给应用程序主窗口(keyWindow) 主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步 找到合适视图控件后,就会调用视图控件touches...方法来作具体事件处理 4.2 那么主窗口如何找到最合适控件来处理事件?...// 用来寻找最合适View处理事件,只要一个事件递给一个控件就会调用控件hitTest方法,参数point 表示方法调用者坐标系上点 - (nullable UIView *)hitTest:...4.4 触摸事件处理详细过程(响应者链传递过程) 用户点击屏幕后产生一个触摸事件,经过一系列传递过程后,会找到最合适视图控件来处理这个事件 找到最合适视图控件后,就会调用控件touches...如果控制器不存在,其父视图为上一个响应者,将其传递给视图视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件或消息传递给window对象进行处理 如果window对象也不处理,

1.6K60

iOS中事件产生和传递

●主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步。找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理。...2.1如何找到最合适控件来处理事件?...1.点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理事件队列中。...2.3如何寻找最合适view 两个重要方法: hitTest:withEvent:方法 pointInside方法 2.4 hitTest:withEvent:方法什么时候调用 只要事件递给一个控件...> UIWindow -> UIView -> initial view,以上就是事件传递,也就是寻找最合适view过程 3.2.1事件响应 首先看initial view能否处理这个事件,如果不能则会将事件递给其上级视图

89910

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

. 2.响应过程 iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application事件队列,单例UIApplication会从事件队列中取出触摸事件并传递给单例...UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在视图(View),即需要将触摸事件递给其处理视图(最合适来处理控件)...1.自己能响应触摸事件 2.触摸点在自己身上 3.从后往前递归遍历子控件, 重复上两步 4.如果没有符合条件子控件, 那么就自己最合适处理 3.两个重要响应方法(UIView) 1.hit-test...view:事件递给控件时候, 就会调用该方法,去寻找最合适view并返回看可以响应view - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent...在视图层次结构最顶级视图,如果也不能处理收到事件或消息,则其将事件递给window对象进行处理 3\.

78231

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

事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件窗口)处理,window对象首先会使用hitTest:withEvent:方法寻找此次Touch...操作初始点所在视图(View),即需要将触摸事件递给其处理视图,称之为hit-test view。...如果一个子视图区域超过父视图bound区域(父视图clipsToBounds属性为NO,这样超过父视图bound区域视图内容也会显示),那么正常情况下对子视图在父视图之外区域触摸操作不会被识别...UITouch对象有一个view属性,表示此触摸操作初始发生所在视图,即上面检测到hit-test view,此属性在UITouch生命周期不再改变,即使触摸操作后续移动到其他视图之上。...【原】ioshitTest方法以及不规则区域内触摸事件处理方法 http://www.cnblogs.com/wengzilin/p/4249847.html hitTest:withEvent:

1K20

iOS面试题-UI篇

可以响应用户事件,Xcode6之后可以方便通过视图调试功能查看图层之间关系 UIView是iOS系统中界面元素基础,所有的界面元素都继承自它。...-(void)viewDidLayoutSubviews; 触摸事件传递 触摸事件传递是从父控件传递到子控件 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件 不能接受触摸事件四种情况...默认就是NO,因此UIImageView以及它子控件默认是不能接收触摸事件 如何找到最合适处理事件控件: 首先,判断自己能否接收触摸事件 可以通过重写hitTest:withEvent:方法验证...如果当前view是控制器view,那么就传递给控制器 如果控制器不存在,则将其传递给父控件 在视图层次结构最顶层视图也不能处理接收到事件或消息,则将事件或消息传递给UIWindow对象进行处理...如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象 如果UIApplication也不能处理该事件或消息,则将其丢弃 补充:如何判断上一个响应者 如果当前这个view

2K21

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

主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件,这也是整个事件处理过程第一步。 找到合适视图控件后,就会调用视图控件touches方法来作具体事件处理。 2....应用如何找到最合适控件来处理事件?...UIView不能接收触摸事件三种情况: 不允许交互:userInteractionEnabled = NO 隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏控件不能接受事件 透明度:如果设置一个控件透明度...view是控制器view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器view,那么父视图就是当前view上一个响应者,事件就传递给视图 2 在视图层次结构最顶级视图...2.UIApplication会从事件队列中取出最前面的事件,把事件递给应用程序主窗口(keyWindow)。 3.主窗口会在视图层次结构中找到一个最合适视图来处理触摸事件

1.2K10

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

当发生屏幕旋转事件时候,UIapplication对象会将旋转事件递给uiwindow,uiwindow又会将旋转事件递给根控制器,由根控制器决定是否需要旋转UIapplication->uiwindow...4.2.2 (未解决)DrawRect如何清空之前内容 4.2.3 DrawRect之后注意用hitTest:withEvent:方法处理事件接收 //用户触摸时第一时间加载内容 - (UIView*...当然,这个补充对于触摸事件无效,触摸事件第一响应者是根据hitTest确定而来,有点绕,需要仔细捋捋。     ...Application事件队列,UIApplication会从事件队列中取出触摸事件并传递给key window(当前接收用户事件窗口)处理,window对象首先会使用hitTest:withEvent...:方法寻找此次Touch操作初始点所在视图(View),即需要将触摸事件递给其处理视图,称之为hit-test view。

54130

iOS OC swift 自定义 popover 泡泡

Bool /// 是否点击空白地方自动消失 /// 设置为 true 时候,空白地方可以处理触摸事件 /// 当 touchThrough 为 true 时候,此字段不起作用 arrowDirection...防止内容覆盖圆角 targetSize: CGSize /// 需要展示内容大小,此字段一定需要重新设置 /// 并且宽高大小加上 minScreenEdg contentInset 不能大于屏幕宽高...contentView: UIView /// 自定义内容请在此视图上增加 arrowView: KKPopoverArrowView 箭头视图 delegate: KKPopoverDelegate..., sourceView: UIView) /// 根据 sourceView 展示在指定视图中 /// - Parameters: /// - view: 添加到视图,不则添加到 window...内部合适方向使用 open class KKPopoverArrowView: UIView 箭头视图配置项 /// 边角弧度 open var borderRadius: CGFloat

2.7K70

iOS事件响应控制 原

在处理这个问题之前,我们应该先清楚IOS事件响应机制到底是个什么样原理。 首先,这个事件响应机制是分为两个部分。 1、先在视图层级关系中找到应该响应事件那个视图。...这一步是什么意思,其实很简单,就是找到你所触摸点对应那个最上层视图,它工作原理是这样:当用户发出事件后,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理事件队列中,...UIApplication会取出队列中最前面的事件,发消息给UIWindow,然后UIWindow会对其所有子视图调用hitTest:withEvent:这个方法,这个方法会返回一个UIView对象,...这个方法在执行时候,它会调用当前视图pointInside:withEvent:这个方法,如果触摸事件在当前视图范围内,pointInside:withEvent:会返回YES,否则会返回NO;如果返回...可以证明,在事件视图寻找中,UIImageView我们重写hitTest:withEvent:方法后,切断了寻找链,如果我们这个做: -(UIView *)hitTest:(CGPoint)point

53540

Android下Touch事件分发详解

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

11910

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

基本知识点: 0 UITouch 当每一个指尖在屏幕上触发一次触摸事件时,系统就会生成对应一个UITouch对象,用于记录当前触摸状态,主要包含运动相位、位置、大小、运动、力度(iOS9)等数据;...:(nullable UIView *)view; // 获取上一次坐标 1 UIEvent 在iOS系统中一个UIEvent对象代表着一个事件在,有四种类型事件触摸事件( UIEventTypeTouches...事件队列中; UIApplication会从事件队列中取出最前面的事件进行分发以便处理,通常先发送事件给应用程序主窗口(UIWindow); 主窗口会调用hitTest:withEvent:方法在视图...(UIView)层次结构中找到一个最合适UIView来处理触摸事件,并将UITouch与UIEvent交给UIView处理(通过touchesBegan/touchesMoved/touchesEnded...继续将事件递给下一个响应者,如果一直没有能处理响应者,这个事件会一直传递到UIApplication,最终废弃。

1.2K90
领券