新浪微博客户端(59)-hitTest withEvent方法的使用说明

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(100, 100, 100, 100);
    [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来处理了。

  

 



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   夜行过客  阅读(402)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示