您的位置:首页 > 产品设计 > UI/UE

UIEvent - 3

2015-08-31 17:23 246 查看
对上一节的例子做一些修改:

LBEventTestView.h

#import <UIKit/UIKit.h>

@interface LBEventTestView : UIView

@property (nonatomic, strong) NSString* colorString;//增加辨识变量colorString

@end


LBEventTestView.m

#import "LBEventTestView.h"

@implementation LBEventTestView

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    
    NSLog(@"ColorString hitTest : %@,  %@", self.colorString, [super hitTest:point withEvent:event]);
    
    return [super hitTest:point withEvent:event];
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    NSLog(@"ColorString pointInside : %@,  %@", self.colorString, [super pointInside:point withEvent:event]? @"YES" : @"NO");
    
    return [super pointInside:point withEvent:event];
}

@end


调用的视图控制器:

#import "Masonry.h"
#import "LBEventTestView.h"
#import "UIEventTestController.h"

@implementation UIEventTestController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //RED
    LBEventTestView* redView = [[LBEventTestView alloc] init];
    redView.colorString = @"RED";
    [redView setBackgroundColor:[UIColor redColor]];
    [self.view addSubview:redView];
    
    [redView mas_makeConstraints:^(MASConstraintMaker* make){
    
        make.center.mas_equalTo(self.view);
        make.size.mas_equalTo(CGSizeMake(250, 350));
    }];
    
    
    //YELLOW
    LBEventTestView* yellow = [LBEventTestView new];
    yellow.colorString = @"YELLOW";
    [yellow setBackgroundColor:[UIColor yellowColor]];
    [redView addSubview:yellow];
    
    [yellow mas_makeConstraints:^(MASConstraintMaker* make){
        
        make.centerX.equalTo(redView);
        make.size.mas_equalTo(CGSizeMake(100, 80));
        make.top.mas_equalTo(redView.mas_top).with.offset(30);
        
    }];
    
    //GREEN
    LBEventTestView* green = [LBEventTestView new];
    green.colorString = @"GREEN";
    [green setBackgroundColor:[UIColor greenColor]];
    [redView addSubview:green];
    
    [green mas_makeConstraints:^(MASConstraintMaker* make){
    
        make.centerX.equalTo(redView);
        make.size.mas_equalTo(yellow);
        make.bottom.mas_equalTo(redView.mas_bottom).with.offset(-30);
    
    }];
}

@end


如图:



分别点击这4个区域然后参考上文的文章理解。

挑选一个点击区域1和区域4来讲解:

区域1:



解析:点击白色区域1,开始遍历子视图的时候发现点击点不在RED红色区域(因为return的都是NO),就不继续调用别的在RED相关的子视图了。那一定会问为什么会调用了两次? 如图上所示是两次,看看文档的方法描述:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;   // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system


就是这个方法搞的鬼,它是用递归式的调用。所以调用的是多次,具体是多少次,我还真不敢说。(因为不懂哈哈)

区域4:



可以清楚看到,yellow视图同为RED的子视图,是完全不会去调用的。连Return NO的机会都没有。慢慢的似乎有一点点的规律,上一节的两层视图的结构就会调用2次,这一节的3层视图的结构就会调用6次,我严重怀疑recursively是不是 视图继承层数 H * 2 呢。以后懂了再在这里阐述吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: