iOS中的触摸事件总是由最顶层的View首先得到的,当这个View得到该触摸事件的时候可以选择通过

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {

    return YES;

}

方法来决定是否由当前控件来消费掉触摸事件,YES代表由当前控件消费,事件则不再向下传递;No代表事件继续向下传递。与android里面的onTouchEvent返回布尔值类似。

当我们决定由当前控件来消费掉此事件时,还可以进一步决定由当前控件的哪一个子控件(包括自身)来消费掉此触摸事件,为此苹果提供了下列方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    return self.redView;

}

通过指定返回的View来告诉操作系统,具体由哪一个控件来消费掉触摸事件。

示例代码:

在Xcode中创建两个自定义View,GreenView和RedView

GreenView.m

#import "GreenView.h"
#import "RedView.h" @interface GreenView() @property (nonatomic,weak) UIView *redView; @end @implementation GreenView - (void)awakeFromNib { self.backgroundColor = [UIColor greenColor]; RedView *redView = [[RedView alloc] init];
redView.frame = CGRectMake(, , , );
[self addSubview:redView];
self.redView = redView; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSLog(@"GreenView 被点击"); }
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { return self.redView; } @end

RedView.m

#import "RedView.h"

@implementation RedView

- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) { self.backgroundColor = [UIColor redColor]; }
return self;
} - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { NSLog(@"RedView 被点击..."); } @end

为简化操作,将默认的storyboard中创建的View,修改为GreenView:

项目目录:

我们在GreenView中添加了如下代码,保证当GreenView收到触摸事件时,转交给RedView来处理:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

    return self.redView;

}

运行:

此时,我们可以点击绿色的任意区域,发现系统打印的Log已经变成:

说明我们已经成功的将GreenView的触摸事件交给RedView来处理了。

新浪微博客户端(59)-hitTest withEvent方法的使用说明的更多相关文章

  1. 消息点击事件的响应链---hitTest:withEvent:方法

    *当用户点击屏幕时,会产生一个触摸事件,系统会将触摸事件加入到 UIApplication管理事件队里中 *UIApplication 会从事件队列中取出最前面的事件进行分发以便处理,通常,先发送事件 ...

  2. 响应者链 hittest:withEvent: 方法的使用

    关于响应者链部分的基础内容 参考http://www.cnblogs.com/wendingding/p/3795171.html 这里我要说明的是 关于- (UIView *)hitTest:(CG ...

  3. hitTest:withEvent:方法(此方法可实现点击穿透、点击下层视图功能)

    此方法可实现点击穿透.点击下层视图功能 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIAppl ...

  4. hitTest:withEvent:方法流程

    此方法可实现点击穿透.点击下层视图功能. 一. hitTest:withEvent:调用过程 iOS系统检测到手指触摸(Touch)操作时会将其放入当前活动Application的事件队列,UIApp ...

  5. 关于UIView的hitTest:withEvent:方法的理解

    闲来无事 观摩别人的项目 常常发现对UIView的hitTest:withEvent:方法的重写,以前也查过这个方法的用法作用,但是时间一长又忘记了.今天再次看到,就记录一下. 用户触摸屏幕后事件的传 ...

  6. 理解点击屏幕的事件响应--->对UIView的hitTest: withEvent: 方法的理解

    要理解这两个方法.先了解一下用户触摸屏幕后的事件传递过程. 当用户点击屏幕后,UIApplication 先响应事件,然后传递给UIWindow.如果window可以响应.就开始遍历window的su ...

  7. 点击事件处理, 以及hitTest:withEvent:实现

    发送触摸事件后, 系统会将事件添加到系统UIApplication的事件管理队列中 UIApplication会在事件队列的最前端取出事件,然后分发下去,以便处理, 通常会把事件首先分发给KeyWin ...

  8. 新浪微博客户端开发之OAuth认证篇

    新浪微博客户端开发之OAuth认证篇 2013年7月29日新浪微博客户端开发 OAuth2.0授权机制我在这里就不浪费口舌了,有很多大牛都发表过相关的文章解释OAuth2.0认证的流程,我就随便找了一 ...

  9. UITableView/UIScrollView 不能响应TouchBegin 的处理 及窥见 hitTest:withEvent:

    重写touchBegin 方法是不行的,在UITableView/UIScrollView 解决方案 重写hitTest:withEvent:  在他们的子类中 - (UIView *)hitTest ...

随机推荐

  1. BZOJ 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status] ...

  2. 前端打包/自动化构建工具:fis3

    据说这个可以进行打包,并且可以实现类似/script/test-adsf123.js或者/script/test.js?v=asdf123 先做个记号 参考:http://fis.baidu.com/

  3. [NOIP2015] 提高组 洛谷P2668 斗地主

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  4. windows核心编程读后感(待续)

    自从大一读那本超厚的C程序设计以后,从来没有像这样慢慢地读一本书了.windows核心这本书足足看了2个多星期.一张张慢慢看,做笔记.感觉学到了很多基础的知识,关于内核方面的没有啥可以做实验的,都在看 ...

  5. ubuntu14.04 gedit显示GB2312中文编码

    在中文支持配置还不完整的Ubuntu 14.04中,使用gedit打开带有中文字符的文件有时会出现乱码的情况,这是由于gedit对字符编码匹配不正确导致的,解决方法如下: 在终端中输入如下命令,然后重 ...

  6. 踩的python列表及for循环一个坑儿

    一个列表循环的问题,困扰了半个小时,我也是醉了,值得深思 下面开始提需求: 一个列表mylist = [{'tag':1,'num' :5000},{'tag':2,num: 6000},{'tag' ...

  7. CentOS关闭火狐浏览器Flash过期提示

    关闭旧版插件屏蔽提示 打开 about:config?filter=extensions.blocklist.enabled 右键切换,关闭flash版本过旧被屏蔽的提示. 参考: http://ti ...

  8. POJ 1064 Cable master (二分)

    题目链接: 传送门 Cable master Time Limit: 1000MS     Memory Limit: 65536K 题目描述 有N条绳子,它们长度分别为Li.如果从它们中切割出K条长 ...

  9. Linux以外的开源操作系统大汇总

    开源操作系统即公开源代码的操作系统软件,它遵循开源协议使用.编译和发布.自由和开放源代码软件中最著名的是Linux,它是一种类Unix的操作系统.Linux可安装在各种计算机硬件设备中,比如手机.平板 ...

  10. 捉襟见肘之UIView中contentMode属性

    UIView.h @property(nonatomic) UIViewContentMode contentMode; // default is UIViewContentModeScaleToF ...