iOS UIView事件隔层传递 pointInside:withEvent:

原创 2015年11月18日 14:48:04

多层视图重叠跳过中间层,实现隔层视图事件响应

 

//

//  DataViewController.m

//  UIScrollViewPanGesture

//

//  Created by Peace on 11/17/15.

//  Copyright © 2015 Peace. All rights reserved.

//

 

#import "DataViewController.h"

 

 

@interface TestView1 : UIView

 

@end

 

@implementation TestView1

 

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

{

    CGRect frame = CGRectMake(00,

                              self.frame.size.width,

                              self.frame.size.height);

    BOOL value = (CGRectContainsPoint(frame, point));

    NSArray *views = [self subviews];

    for (UIView *subview in views) {

        value = (CGRectContainsPoint(subview.frame, point));

        if (value) {

            return value;

        }

    }

    return NO;

}

 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"1:xxxx");

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"1:yyyy");

}

 

@end

 

@interface TestView2 : UIView

@end

 

@implementation TestView2

 

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

{

    CGRect frame = CGRectMake(00,

                              self.frame.size.width,

                              self.frame.size.height);

    

    BOOL value = (CGRectContainsPoint(frame, point));

    return value;

}

 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"2:xxxx");

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"2:yyyy");

}

 

@end

 

 

/*

 * ViewController

 */

@interface DataViewController ()

 

@end

 

@implementation DataViewController

 

- (void)viewDidLoad

{

    [super viewDidLoad];

    

    //白色视图接受点击事件

    self.view.backgroundColor = [UIColor whiteColor];

    

    //红色视图(****注:不接受点击事件****)

    TestView1 *v1 = [[TestView1 allocinitWithFrame:CGRectMake(50.f50.f200.f200.f)];

    v1.backgroundColor = UIColor.redColor;

    [self.view addSubview:v1];

    

    //黄色视图接受点击事件

    TestView2 *v2 = [[TestView2 allocinitWithFrame:CGRectMake(0.f0.f100.f100.f)];

    v2.backgroundColor = UIColor.yellowColor;

    [v1 addSubview:v2];

}

 

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"3:xxxx");

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSLog(@"3:yyyy");

}

 

@end

iOS 【UIKit-事件产生与传送 练习(重写hitTest和pointInside方法)】

练习要求: 在下图中点击到绿色Button区域,Button响应(包括YellowView覆盖的绿色Button部分也是由绿色Button来响应)。点击YellowView部分(除覆盖绿色Butto...

hitTest和pointInside如何响应用户点击事件

• 当用户点击屏幕时,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理的事件队列中 • UIApplication会从事件队列中取出最前面的事件进行分发以便处理,通常,先...
  • conslee
  • conslee
  • 2015年04月24日 10:27
  • 1718

iOS 关于UIView的userInteractionEnabled属性(多层视图到点击事件)

如果父视图为ParentView包含一个Button,如果再ParentView上添加子视图ChildView,且ChildView盖住了Button,那么Button就得到不响应了,为了让Butto...

iOS的事件分发

移动平台

hitTest:(CGPoint)point withEvent:(UIEvent *)event

UIView的hitTest:方法和pointInside:方法的实现 2015-03-31      0 个评论    来源:zhangping871的专栏    收藏    我要投...

模拟UIView的hitTest:方法和pointInside:方法的实现

对于UIView 的两个方法的讲解: - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event - (BOOL)pointInside...

UIView的hitTest:方法和pointInside:方法的实现

处理原理如下: ? 当用户点击屏幕时,会产生一个触摸事件,系统会将该事件加入到一个由UIApplication管理的事件队列中 ? UIApplication会从事件队列中取出最前面的事件...

hitTest:withEvent:和pointInside:withEvent:

hitTest:withEvent:方法的处理流程如下: 首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;若返回NO,则hitTest:withEv...

UiView事件传递相关函数:pointInside:withEvent:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { }    这个函数的用处是判断当前的点击或...

对UIView的hitTest: withEvent: 方法的理解

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; - (BOOL)pointInsid...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS UIView事件隔层传递 pointInside:withEvent:
举报原因:
原因补充:

(最多只允许输入30个字)