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

如何从另一个UIView向UIButton转发触摸?

从一个UIView向UIButton转发触摸可以通过以下步骤实现:

  1. 创建一个自定义的UIView子类,作为中间转发者(例如,名为TouchForwardingView)。
  2. 在TouchForwardingView类中,重写hitTest方法来捕获触摸事件。
  3. 在hitTest方法中,判断触摸点是否在UIButton的范围内,如果是,则返回UIButton对象,将触摸事件直接传递给UIButton处理。
  4. 如果触摸点不在UIButton的范围内,则返回nil,将触摸事件传递给TouchForwardingView的下一个响应者(例如,父视图)处理。

以下是一个示例代码:

代码语言:swift
复制
class TouchForwardingView: UIView {
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let button = self.subviews.first(where: { $0 is UIButton }) as? UIButton
        if let button = button, button.frame.contains(point) {
            return button
        }
        return super.hitTest(point, with: event)
    }
}

在上述示例中,我们创建了一个TouchForwardingView类,并重写了hitTest方法。在hitTest方法中,我们首先找到TouchForwardingView中的UIButton对象,然后判断触摸点是否在UIButton的范围内。如果是,则返回UIButton对象,将触摸事件传递给UIButton处理。如果不是,则调用父类的hitTest方法,将触摸事件传递给TouchForwardingView的下一个响应者。

使用这个TouchForwardingView类,你可以将其添加到视图层次结构中,并将需要转发触摸的UIButton添加到TouchForwardingView中。这样,当触摸事件发生时,TouchForwardingView将会判断触摸点是否在UIButton的范围内,并将触摸事件传递给UIButton处理。

请注意,这只是一种实现方式,具体的实现可能会根据你的需求和项目结构而有所不同。

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

相关·内容

事件传递、响应者链条

一、事件 iOS里有三种事件:触摸(touch)、加速(motion)、远程控制 在UIResponder里,有以下事件处理 // 触摸事件 - (void)touchesBegan:(NSSet...[self pointInside:point withEvent:event]) return nil; // 3.后往前遍历自己的子控件,看是否有子控件更适合响应此事件 int count...(即调用super的touches方法),之前往下走的路线往上回传,在其中加入了Viewtroller来处理 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父View...四、实例分析 UIButton的继承链是: UIButton->UIControl->UIView->UIResponder->NSObject UIApplication能够接受事件,因为UIApplication...和UIView一样继承自UIResponder 下面是一个点击事件的方法过程 UIButton *button = [UIButton buttonWithType:UIButtonTypeContactAdd

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

    1.如何获取用户控件的点击行为 事实上,由于获取的“所见所得”点击view行为,所以,思路上应该是对uiview或者及其子类得某个事件方法hook到,这样触发点击(广义上是触摸)行为后,可以根据发送的事件确定点击的...sendAction:to:forEvent: 将target、action以及event对象发送给全局应用,Application对象再通过 sendAction:to:from:forEvent: target...这里我们用第一个,sendAction:to:forEvent: 里面有三个参数,最后一个是event,可以通过allTouches方法,可以获得触摸点的集合,可以判断多点触摸事件 而touch.view...进行判断,并获取title了 触摸事件参考文章:https://www.cnblogs.com/syxchina/archive/2012/10/14/2723541.html 2.如何获取不同控件的title...先从简单的开始 一阶获取的控件:UIButton 响应的uiviewUIButton,即用户点击的是按钮,则立马获取(即一阶获取) NSString * title = [[button titleLabel

    1.4K10

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

    的Subview B、C; 2、触摸点不在ViewB内,触摸点在ViewC内部,所以检查ViewC的Subview D、E; 3、触摸点不在ViewD内,触摸点发生在ViewE内部,并且ViewE没有...subview,所以ViewE属于ViewA中包含这个点的最小单位,所以ViewE变成了该次触摸事件的hit-Test View; 4.1.2注意点 1、默认的hit-testing顺序是按照UIView...suenblog.duapp.com/blog/100032/iOS事件分发机制(二)The%20Responder%20Chain 4.2.1事件传递原理 响应链简单来说,就是一系列的相互关联的对象,firstResponder...这里就说到了另一个问题,UIResponder在知道需要处理事件的时候,还是有决定权的,比如我可以决定让整个响应链继续走下去,或者直接中断掉整个响应链。...当然,这个补充对于触摸事件无效,触摸事件的第一响应者是根据hitTest确定而来的,有点绕,需要仔细捋捋。

    69110

    《Motion Design for iOS》(十五)

    UIKit和CoreAnimation开始 通常情况下,iOS app中屏幕上的物体都是UIView对象。它们是矩形的并且有坐标和大小来定义它们在屏幕上的位置和尺寸。...UIView是用来构建你的界面的UIKit Framework中基本的界面对象。每个视图都可能伴随着文本、形状或图片绘制。...这些是为某些功能或特性特定的特殊的UIView对象。包括作为界面按钮的UIButton、用来显示图片的UIImageView、显示文本的UILabel和显示列表的UITableView。...电池等级视图(苹果控制) “汉堡包”菜单按钮 标题栏中的标题标签 改变子板的按钮 一个UITableViewCell视图,用来包含UITableView中一行的元素 UILabel中的帖子标题 评论数量UIButton...UIView对象有很多的职责,其中之一就是事件处理,即响应触摸事件。如果你想的话你界面中的所有视图都可以响应触摸事件,或者你可以指定只有特定的视图会在用户触摸它们时响应。

    85640

    iOS事件响应控制 原

    这一步是什么意思,其实很简单,就是找到你所触摸点对应的那个最上层的视图,它的工作原理是这样的:当用户发出事件后,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理的事件队列中,...UIApplication会取出队列中最前面的事件,发消息给UIWindow,然后UIWindow会对其所有子视图调用hitTest:withEvent:这个方法,这个方法会返回一个UIView的对象,...这个方法在执行的时候,它会调用当前视图的pointInside:withEvent:这个方法,如果触摸事件在当前视图范围内,pointInside:withEvent:会返回YES,否则会返回NO;如果返回...可以证明,在事件视图寻找中,UIImageView我们重写hitTest:withEvent:方法后,切断了寻找链,如果我们这个做: -(UIView *)hitTest:(CGPoint)point ...现在,在回到我们刚开始的问题,如何让btn响应的同时imageView也响应,我们这样做: - (void)viewDidLoad {     [super viewDidLoad];     MyImageView

    54640

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

    (提示:关于这部分可以查看story的初始化的文档) 1.3 如何获取window?...从这个意义上来说,视图发送setNeedsDisplay消息。任何UIView对象标记为需要显示後将会在应用程序循环中自动重新绘制。...举个例子,文件从一个视图到另一个视图,然後使用一个UIView子类的容器视图,如下: 1.Begin an animation block. 2.Set the transition on the container...4.2.2 (未解决)DrawRect如何清空之前内容 4.2.3 DrawRect之后注意用hitTest:withEvent:方法处理事件接收 //用户触摸时第一时间加载内容 - (UIView*...:withEvent:返回nil;     • 若返回YES,则当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是top到bottom,即从

    62830

    【iOS 开发】 setNeedsLayout 说起

    本文 setNeedsLayout 这个方法说起,分享与其相关的 UIKit 视图交互、使用场景等内容。...UIKit interactions with your view objects 上图对应的事件序列如下: 用户触摸屏幕 硬件报告触摸事件给 UIKit 框架 UIKit 框架将触摸事件打包成 UIEvent...---- 如何善用 View Drawing Cycle 一个很常见的例子是,一个 iPad App,横屏和竖屏时界面布局不一样,那么你可以监听设备旋转,在设备旋转时执行 setNeedsLayout...code>layoutSubviews 和 drawRect:) 但有些情况比较特殊:你打开 iOS 的时钟应用,去看里面的秒表页面,这个页面里面的两个按钮是没有 UIButton...实现方法如下: extension UIButton { func quickButtonAction() { UIView.performWithoutAnimation({

    70710

    Quartz2D复习(三) --- 涂鸦

    和上一篇手势解锁不一样,手势解锁只画了一条路径,触摸开始--》触摸移动--》触摸结束 ,然后路径完成了,渲染出来就是手势解锁了; 这次涂鸦想做到的效果是可以画很多次线段或弧,每次又可以设置不同的宽度和颜色...view, 用来展示涂鸦,名称为:PaintingView PaintingView.h文件代码: #import @interface PaintingView : UIView...UITouch *touch = [touches anyObject]; 52 return [touch locationInView:self]; 53 } 54 55 //次方法是UIView...的分类@interface UIView(UIViewRendering)中添加的方法 56 //setNeedsDisplay方法也是此分类中的方法 57 - (void)drawRect:(CGRect...{ //保存成功 106 lbl.text = @"保存成功"; 107 } 108 [self addSubview:lbl]; 109 110 [UIView

    67130

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

    View视图 @property(nullable, nonatomic,readonly) UIView *view; 4、是否取消触摸控件的响应 默认为YES,这种情况下当手势识别器识别到触摸之后...action; 3、移除一个手势的监听事件 - (void)removeTarget:(nullable id)target action:(nullable SEL)action; 4、指定一个手势需要另一个手势执行失败才会执行...- (CGPoint)locationInView:(nullable UIView*)view; 6、获取触摸手指数 - (NSUInteger)numberOfTouches; 7、多指触摸触摸点相对于指定视图的位置...UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; 例子:UITapGestureRecognizer和UIButton...UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ if ([touch.view isKindOfClass:[UIButton

    3K81

    iOS UIButton 点击无响应的解决办法

    :(UIEvent *)event 这是View里的一个方法,处理流程如下 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内; 若返回NO,则hitTest:...withEvent:返回nil; 若返回YES,则当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是top到bottom,即从subviews...最后,这个触摸事件交给主窗口的hitTest:withEvent:方法返回的视图对象去处理。...所以我们可以在返回nil时进行处理,因为这个时候button是在父View外的 //返回一个view来响应事件 - (UIView *)hitTest:(CGPoint)point withEvent:...tempPoint)){ //返回按钮 return _testBtn; } } return view; } 这个时候按钮在区域外点击也有效果了 总结 以上所述是小编给大家介绍的iOS UIButton

    3.4K10

    iOS 中的事件响应

    若两个手指一前一后触摸同一个位置 (即双击),那么第一次触摸时生成一个 UITouch 对象,第二次触摸会更新这个 UITouch 对象,这是该 UITouch 对象的 tapCount 属性值 1...因此以下类作为 UIResponder 的派生类都可以是响应者: UIView UIViewController UIApplication AppDelegate Hit-Testing 触摸事件发生后...系统通过hitTest方法沿视图层级树底向上(根视图开始),后向前(逻辑上更靠近屏幕的视图开始)进行遍历,最终返回一个适合响应触摸事件的 View,并在过程中为 UITouch 记录了 view...-> Bool target发送action。...UIButton 会截断响应链的事件传递,也可以利用响应链来寻找 Action Method。 2. UIGestureRecognizer 仍然会先于 UIControl 接收到触摸事件; 3.

    2.7K11

    iOS面试题-UI篇

    的子View树形结构,也可以它的layer上添加子layer,来完成某些特殊的显示。...这样的话性能的角度来说,对CPU和内存来说都是欠佳的。...特别是如果在我们的界面上有多个这样的UIButton实例,那就会很糟糕了 面试题持续整理更新中,如果你正在面试或者想一起进阶,不妨添加一下交流群1012951431一起交流。...触摸事件的传递是从父控件传递到子控件 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件 不能接受触摸事件的四种情况 不接收用户交互,即:userInteractionEnabled = NO...如何找到最合适处理事件的控件: 首先,判断自己能否接收触摸事件 可以通过重写hitTest:withEvent:方法验证 其次,判断触摸点是否在自己身上 对应方法pointInside:withEvent

    2K21

    ios Hit-Test

    要回答这个首先我们来思考另外一个问题:当我们点击界面的时候,iOS是如何知道我们点击的是哪一个View? 其实这个过程就是由Hit-Test来完成的。...iOS中,Hit-Test的作用就是找出这个触摸点下面的View是什么,HitTest会检测这个点击的点是不是发生在这个View上,如果是的话,就会去遍历这个View的subviews,直到找到最小的能够处理事件的...view,如果整了一圈没找到能够处理的view,则返回自身 然后sub View 又开始找。...就是你添加 SubView 的逆序来遍历的,换句话说就是最顶层的 SubView 开始找。 如下图 ?...判断点在不在当前控件 if ([self pointInside:point withEvent:event] == NO) {return nil;} // 3.后往前遍历自己的子控件

    1.3K40

    UIScrollView

    这个参数可以设置减速的速率 UIKIT_EXTERN const CGFloat UIScrollViewDecelerationRateFast NS_AVAILABLE_IOS(3_0); //5.内容视图的原点偏移的一个点...nonatomic) CGPoint contentOffset; //6.内容视图的大小 @property(nonatomic) CGSize contentSize; //7.内容视图的距离,是封闭的滚动视图插图...如果它从这种方法受到NO便停止拖动和转发触摸时间的内容子视图。...Delegate,比如UIScrollViewDelegate、UITextFieldDelegate 代理方法:方法名一般是控件名开头,比如UIScrollView的代理方法一般以scrollView开头 如何监听控件的行为...通过addTarget: 只有继承自UIControl的控件,才有这个功能 UIControlEventTouchUpInside : 点击事件(UIButton) UIControlEventValueChanged

    1.8K60

    【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )

    Storyboard 拖线关联 IBAction 返回值方法 与 界面控件, 默认绑定 Touch Up Inside 事件; ② 右键选择按钮 Send Events 列表中的按钮事件代码拖线,...UITextView : 多行文本标签 控件, 支持 多行显示, 滚动功能, 用户可编辑 ; 5.UIProgressView : 进度条 控件, 水平 进度条 ; 6.UISlider : 滑块 控件, 可触摸滑动的进度条...点击按钮, 将用户在 UITextField 输入的字符串转为 int 类型, 相加, 将结果转为字符串显示在 最后一个 UILabel 中; ---- ( 3 ) 界面编辑 界面编辑 : 1....: 将一个按钮控件拖入 UIView 控件中, 修改文字为 改变颜色; 这里尝试一种新的方法来进行按钮点击方法设置; ① 进入辅助编辑器模式 : 一个显示 Main.storyboard, 另一个显示...控件 : 添加一个 UIButton 控件, 修改标题为 “修改随机颜色” 控件到 UIViewController.m 中拖线, 点击方传入 Sender , 参数如下设置; 生成的方法为 - (IBAction

    4.9K30

    Quartz2D复习(四) --- 图层CALayer和动画CAAnimation

    1、CALayer 1)、在ios中,能看得见摸得着的东西基本上都是UIView, 比如按钮、文本标签、文本输入框、图标等,这些都是UIView 2)、UIView之所以能显示在屏幕上,完全是因为它内部的一个图层...UIView的显示。...和CALayer的比较   通过CALayer,可以做出跟UIView一样的界面效果;但是UIView多了一个事件处理的功能,CALayer不能处理用户的触摸事件;   不过CALayer的性能会高一些...fromValue : keyPath相应属性的初始值   toValue: keyPath相应属性的结束值   动画过程说明: 随着动画的进行,在长度为duration的持续时间内,keyPath相应属性的值fromValue...关键帧动画   关键帧动画,也是CAPropertyAnimation的子类,与CABasicAnimation的区别是:   CABasicAnimation只能从一个数值(fromValue) 变到另一个数值

    1.4K30

    iOS 事件处理机制与图像渲染过程

    如图1-1所示,描述了一个触摸事件操作系统层传送到应用内的main runloop中的简单过程。 ?...SpringBoard 只接收按键(锁屏/静音等),触摸,加速,接近传感器等几种 Event,随后用 mach port 转发给需要的App进程。...通常事件比如 UIButton 点击、touchesBegin/Move/End/Cancel 事件都是在这个回调中完成的。...CALayer 在iOS当中,所有的视图都从一个叫做UIVIew的基类派生而来,UIView可以处理触摸事件,可以支持基于Core Graphics绘图,可以做仿射变换(例如旋转或者缩放),或者简单的类似于滑动或者渐变的动画...实际上这些背后关联的Layer图层才是真正用来在屏幕上显示和做动画,UIView仅仅是对它的一个封装,提供了一些iOS类似于处理触摸的具体功能,以及Core Animation底层方法的高级接口。

    5.5K100
    领券