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

当多个UIView相互重叠时,即使在顶部UIView上也会截获tap

在iOS开发中,当多个UIView相互重叠时,只有最上层的UIView能够接收到用户的触摸事件。这是因为UIView的事件传递机制是基于响应者链(Responder Chain)来实现的。

响应者链是一个由UIResponder对象组成的链表,它负责将触摸事件从最上层的视图传递到最底层的视图。当用户点击屏幕时,系统会将触摸事件发送给应用程序的主窗口(UIWindow),然后通过响应者链将事件传递给合适的视图进行处理。

在多个UIView相互重叠的情况下,如果顶部的UIView不处理触摸事件,那么事件会被传递给下方的UIView进行处理。只有当某个UIView处理了触摸事件后,事件传递才会停止,不再继续向下传递。

如果希望在多个重叠的UIView上都能够接收到触摸事件,可以通过以下几种方式来实现:

  1. 使用hitTest方法:通过重写UIView的hitTest方法,可以自定义触摸事件的响应范围。在hitTest方法中,可以根据触摸点的位置判断应该响应哪个UIView。
  2. 使用gestureRecognizer:可以给每个UIView添加独立的手势识别器(UIGestureRecognizer),这样每个UIView都可以独立地响应触摸事件。
  3. 调整UIView的层级关系:可以通过调整UIView的层级关系,将需要接收触摸事件的UIView置于最上层。

以上是关于当多个UIView相互重叠时,即使在顶部UIView上也会截获tap的解释和解决方法。如果您对iOS开发和UIView的事件传递机制感兴趣,可以参考腾讯云的移动开发服务,例如腾讯云移动开发平台(https://cloud.tencent.com/product/mmp)提供了丰富的移动开发工具和服务,帮助开发者快速构建高质量的移动应用。

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

相关·内容

iOS 中的事件响应

多个手指先后触摸,系统根据触摸的位置判断是否更新同一个 UITouch 对象。...该规则保证了系统优先测试视图层级树中最后添加的视图,如果视图之间有重叠,该视图也是同级视图中展示最完整的视图,即用户最可能想要点的那个视图。...手势之间的依赖关系 触摸事件发生,哪个 UIGestureRecognizer 先收到这个事件并没有固定的顺序,我们可以使用UIGestureRecognizer 提供的方法来控制它们之间的顺序和相互关系...可以注意到addTarget,target类型是一个可选值,如传入 nil ,Application自动响应链从上往下寻找能响应action的对象。..., in view: UIView) -> Bool // UIScrollView的子类中重写该方法,用于返回是否取消已经传递给子视图的事件,默认子视图是UIControl返回NO,否则返回YES

2.7K11

iOS14开发-触摸与手势识别

一个手指触摸屏幕,就会生成一个 UITouch 对象,如果多个手指同时触摸,就会生成多个 UITouch 对象。 属性 (1)window:触摸所处的 UIWindow。...事件响应 找到最合适的响应者之后,响应者对于触摸事件,有以下 3 种操作: (1)不拦截,事件沿着默认的响应链自动传递。...使用步骤 创建手势实例,指定回调方法,手势开始,改变、或结束,回调方法被调用。 将手势添加到需要的 UIView 。...每个手势只对应一个 UIView屏幕触摸在当前 UIView,如果手势和预定的一样,回调方法就会调用。 手势可以通过 storyboard 或者纯代码使用。...,但是一个 UIView 可以有多个手势。

2.3K20
  • iOS-手势UIGestureRecognier详解一. 手势UIGestureRecognier简介二. 手势的抽象类——UIGestureRecognizer三. UIGestureRecogni

    //[A requireGestureRecognizerToFail:B]手势互斥 它可以指定当A手势发生,即便A已经滿足条件了,不会立刻触发,等到指定的手势B确定失败之后才触发。...,当我们把cancelTouchesInView设置为NO屏幕滑动,两种方式都在触发,打印如下: ?...属性默认是YES,设为YES在手势识别结束后,等待一个很短的时间,如果没有接收到新的手势识别任务,才会发送touchesEnded消息到事件传递链,设置为NO之后会立刻发送touchesEnded...而tap.delaysTouchesEnded = YES;,轻拍三下屏幕,打印如下 ?...即便A已经滿足条件了,不会立刻触发,等到指定的手势B确定失败之后才触发。

    2.5K50

    IOS开发系列——UIView专题之四:事件分发机制篇【整理,部分原创】

    中Subviews的逆顺序; 2、如果View的同级别Subview中有重叠的部分,则优先检查顶部的Subview,如果顶部的Subview返回nil,再检查底部的Subview; 3、Hit-Test...4.1.3事件检测实现 Hit-Test的检查机制如上所示,确定了Hit-TestView,如果当前的application没有忽略触摸事件(UIApplication:isIgnoringInteractionEvents...*如果*returnSuper=YES,则代表返回super hitTest:withEvent:,否则则按照block的返回值(即使是nil) * * @discussion切记,千万不要在这个...如果中断了响应链,那么所有的nextResponder都不会得知有事件发生,iOS提供了这个方法,其实很简单: 我们重写TouchesEvents的时候,如果不想让响应链继续传递,就不调用super...有关触摸事件响应链的分发,就差不多这么多东西,最重要的是大家可以看那几个touches方法,多做实验,就可以了解的更加深入。

    69210

    实践-小细节 II

    如果了解opaque,需要点屏幕绘制的知识, 屏幕的每个像素点都是通过RGBA值(Red、Green、Blue三原色再配上Alpha透明度)表示的, 纹理(UIView绘图系统中对应的表示项)出现重叠..., GPU按照Result = Source + Destination * (1 - SourceAlpha)公式计算重叠部分的像素。...Result是结果RGB值,Source为处在重叠顶部纹理的RGB值, Destination为处在重叠底部纹理的RGB值。...Paste_Image.png 尤其是使用继承的时候,这个 隐蔽的调用 super 方法的地方造成很多隐蔽的错误。...#这样的错误是 把A数组和B数组指针置为相同了, 可变数组 A里面的值发生改变,自然 #可变数组 B 里面的值发生相同的改变,因为两者指的的内存地址是同一处。

    72120

    UIGestureRecognizer  手势识别一、概念介绍二、UIView 的分类三、UIGestureRecognizer 抽象类四、UIGestureRecognizerDelegate 代理

    touch,设置成NO,手势识别器识别到触摸之后不会发送touchesCancelled给控件,这个时候手势识别器和控件view均响应touch。...touchesCancelled导致触摸事件失效、 @property(nonatomic) BOOL cancelsTouchesInView; 5、是否延迟发送触摸事件给触摸到的控件 默认是NO,这种情况下发生一个触摸...有时手势是相关联的,如单机和双击,点击和长按,点下去瞬间可能只会识别到单击无法识别其他,该方法可以指定某一个 手势,即便自己已经满足条件了,不会立刻触发,等到该指定的手势确定失败之后才触发 -...,返回NO则为互斥 是否允许多个手势识别器共同识别,一个控件的手势识别后是否阻断手势识别继续向下传播,默认返回NO;如果为YES,响应者链上层对象触发手势识别后,如果下层对象添加了手势并成功识别继续执行...addGestureRecognizer:rotation]; // 旋转手势的监听方法 - (void)rotateAction:(UIRotationGestureRecognizer *)recognizer { // 原来的基础

    3K81

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

    这些相应的事件就都是UIResponder中定义的。 广告插播的措不及防:如果您要是觉得这篇文章让您有点收获,随手点个赞让俺兴奋好久吶。...UIButton肯定是放在一个UIView上面,UIView肯定是放在一个Controller里面。这几个都是响应者对象,总不能让大家一起给用户反馈吧。...需要2根手指一起敲击 tap.numberOfTouchesRequired = 2; //添加手势识别器到对应的view [self.iconView addGestureRecognizer:...,需要添加多个轻扫手势 轻扫手势默认支持向右的扫动方向 因为轻扫手势要求用户比较放松的扫动,因此最好不要将此手势添加到某一个视图上,局限用户的操作 - (void)addSwipeGesture {...recognizer.view.transform, recognizer.rotation); //将手势识别的旋转角度复位 recognizer.rotation = 0.0; //非常重要 角度叠加

    2.3K40

    iOS 事件传递和处理

    主线程同样启动监听source0,接收eventfetch-thread线程发送的IOHIDEvent数据,再封装成UIEvent,根据UIEvent的类型判断是否需要启动hitTest。...UIKit从UIWindow开始寻找目标视图,先调用UIWindow的hitTest方法询问是否有响应的视图,hitTest方法首先会先调用UIWindow的pointInside方法询问是否点击范围内...UIWindow是UIView的子类,UIView的hitTest方法实现和上述过程一致。 思考: UIView调用子视图hitTest,是先调用哪些子视图?...但是手势识别成功之后,默认cancel后续touch操作,从目标视图开始的响应链都会收到touchesCancelled方法,而不是正常的touchesEnded方法,堆栈如下: ?...上文分析了手势的识别是发生在响应链回调之前,也就是tap手势是发生在touches系列方法回调之前,那么Tap手势应该是UIButton的touches方法之前。

    1.5K20

    iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    localObjBlock copy,系统自动retain对象,增加其引用计数。 blockObjBlock copy不会retain。...block语法的表达式中使用截获的自动变量 NSInteger i = 10; block = ^{ NSLog(@"%ld", i); }; block; 设置的block,如果其作用域结束...同样的,由于__block变量配置,如果其作用域结束,则该__block变量会被销毁。...blockARC和非ARC下有巨大差别。多数情况下,ARC下默认把栈block被直接拷贝生成到堆上。那么,什么时候栈的Block复制到堆上呢?...因为val是栈的。解决办法就是调用copy方法。这种场景,ARC不会为你添加copy,因为ARC不确定,采取了保守的措施:不添加copy。所以ARC下也是异常退出。 ?

    1.8K30

    iOS-视频播放器的简单封装

    ,要注意他们的层次关系,避免相互遮挡。...工具条的显示与隐藏 播放状态点击imageView,就会弹出底部工具条,可以查看当前播放的时间,视频总时间或进行暂停视频、全屏播放等操作。如果没有操作,工具栏会在5秒之后自动隐藏。...,同步更新播放时间和Slider,播放途中点击工具栏暂停按钮暂停播放,需要将视频暂停,并移除定时器,重新开始播放添加定时器,并开始播放 /** toolView暂停按钮的点击事件 */ -...按下移除定时器,拖动根据拖动的值即时的计算当前播放时间并显示label,松开时计算当前播放时间,并跳转到当前播放时间进行播放。...重播按钮和全屏播放按钮的实现 定时器每秒调用的更新Slider的方法中判断视频播放完毕之后,显示遮盖View,而重播按钮的实现,其实就是将Slider的value置为0并重新调用点击Slider松开的方法

    1.9K110

    iOS9新特性——堆叠视图UIStackView

    二、storyBoard初识StackView         UIStackView是一个管理一组堆叠视图的控制器类视图,所谓堆叠视图一种平铺式的线性布局方式,不可重叠,布局方向不可交错,如果你做过...技巧:因为StackView继承于UIView,因此布局改变的时候,我们可以使用UIView层的动画,如下:         //添加view的时候会有动画效果,移除的时候没有         [stackView...(UIView *)view; //指定位置插入一个被管理的视图 - (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex...,竖直布局为宽度充满     UIStackViewAlignmentFill,     //前边对其     UIStackViewAlignmentLeading,     //顶部对其     ...UIStackViewDistribution distribution; 排列方式的枚举如下: typedef NS_ENUM(NSInteger, UIStackViewDistribution) {     //充满,只有一个控件可以使用

    1.9K10

    setNeedsDisplay看我就懂!

    一般来说,使用框架控件,您设置属性(如显示标签或值),您将会使用该属性,这样导致重新绘制控件,因为系统实现对控件drawRect方法的调用。...而我们自定义了自己的UIView子类,所以我们需要处理影响显示的控件的更新。改变颜色的情况下,当然需要我们自己控制重新绘制。...根据一篇文章setNeedsLayout和layoutIfNeeded看我就懂,所以我们circleView.color = color之后添加了对setNeedsLayout或layoutIfNeeded...2、即使视图可能被移动或者有另一个视图重叠可能不需要重新绘制,因此您不能仅仅依靠已经移动整个视图或添加另一个视图基于setNeedsLayout或updateIfNeeded来导致重绘 3、编写重载...drawRect的UIView子类,需要在需要重绘指示给系统。

    1.3K60

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

    commitAnimations     结束一个动画块并开始动画块外。...使用这个方法,多个动画可以被实现。查看setAnimationBeginsFromCurrentState:来了解如果开始一个动画另外一个动画在播放的时候。...中Subviews的逆顺序;     2、如果View的同级别Subview中有重叠的部分,则优先检查顶部的Subview,如果顶部的Subview返回nil, 再检查底部的Subview;     3...如果中断了响应链,那么所有的nextResponder都不会得知有事件发生,iOS提供了这个方法,其实很简单:         我们重写TouchesEvents的时候,如果不想让响应链继续传递...如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds属性为NO,这样超过父视图bound区域的子视图内容显示),那么正常情况下对子视图父视图之外区域的触摸操作不会被识别

    62830

    六天完成一个简单iOS App - 第四天

    (3)手指滑动界面进行切换界面将相应的按钮置于选中状态,底部指示条移动到选中按钮,之前的按钮取消选中状态。页面的滑动切换需要用到ScrollView的代理方法对页面的滑动进行判断。...因此考虑使用控制器View的懒加载,View要显示的时候我们才去加载他,并将View显示屏幕。而其他没有显示的控制器View就不去加载他。如图所示 ?...其实这里add方法是不会重复添加的,即使添加成千上万次只会添加一次。 至此,精华界面的搭建已经基本完成,接下来要做的就是内容的显示,以及内容中一些细节之处的设置。...滑动到最低端,提示用户拉加载更多。2. 滑动到最低端,自动加载下一页内容。...1万显示1.1万,小于1万就显示具体数字,为0,就显示顶,或者踩等汉字。

    1.4K70

    UIViewController生命周期

    合创建一些附加的view和控件 3、ViewWillAppear 视图加载完成,并即将显示屏幕,会调用viewWillAppear方法,在这个方法里,可以改变当前屏幕方向或状态栏的风格等。...Screen触发父UIView的layoutSubviews 改变transform属性,当然frame变 处于key window的UIView才会调用(程序同一间只有一个window为keyWindow...Backgroud后台:程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态停留一。时间到之后会进入挂起状态(Suspended)。...系统自动把程序变成这个状态而且不会发出通知。挂起,程序还是停留在内存中的,系统内存低,系统就把挂起的程序清除掉,为前台程序提供更多的内存。...从继承关系来看,UIWindow继承自UIView,所以UIWindow除了具有UIView的所有功能之外,还增加了一些特有的属性和方法,而我们最常用的方法,就是App刚启动,调用UIWindow的

    1.9K10

    iOS 10 ~ iOS 15 tableview 适配(使用注意事项)

    为Plain,如果有设置sectionHeaderView,sectionHeaderView默认有个22像素的sectionHeaderTopPadding; 如果没有设置sectionHeaderView...为Plain,如果有设置sectionHeaderView或sectionFooterView并且返回的view为nil,滑或者下滑,这两个View都会有颜色的变化,颜色与底色有关,但如果返回的view...tableHeaderView = nil 各系统表现问题 当代码设置 tableHeaderView = nil tableHeaderView = UIView() tableHeaderView...这种需求一般是在有无tableHeaderView之间切换,不需要tableHeaderView,可如下设置 tableHeaderView = UIView.init(frame: CGRect(...nil 前提条件下 1.没有实现sectionHeader或sectionFooter代理(只实现一个不行),所有系统下tableView顶部会有一个空白 2.同时实现了sectionHeader

    2K20

    Texture

    渲染:对于大量文本、图片等的渲染,UIKit组件只能在主线程进行,可能造成GPU绘制的资源紧张;而ASDK会在后台异步绘制图层,不会阻塞主线程的运行。 实际,ASDK的最大特点就是异步。...上图是常见的UIView和CALayer的关系:View持有Layer用于展示,View本身响应触摸事件。 ? ? 上面两图展示了ASNode、UIView以及CALayer三者的关系。...ASTextNode2 ASTextNode的基础修复了一些Bug。...2、图片覆盖文本 ? 这种是通过两个布局规则来实现的: 一个是用于插入文本的ASInsetLayoutSpec,还有一个是将插入文本覆盖图片的ASOverlayLayoutSpec。...alignItems,交叉轴的排列方式 flexWrap alignContent lineSpacing FlexboxASDK中的工作方式与CSSWeb中的工作方式是相同的。

    2.4K61
    领券