2、寻找到应该响应的视图后,会进行消息处理,这个处理的方式是通过消息处理链来做的。如果它自身不能处理消息,会通过nextResponder将消息传递给下一个处理者,默认只要有一个view将消息处理了,这个消息处理传递链将不再传递。
现在,我们把刚才UIimageView里重写的hitTest:withEvent:方法注释掉,给btn添加一个点击方法,同时将用户交互关闭:
- (void)viewDidLoad {
[super viewDidLoad];
MyImageView * image = [[MyImageView alloc]initWithFrame:CGRectMake(60, 80, 200, 200)];
MyButton * btn =[UIButton buttonWithType:UIButtonTypeSystem];
image.userInteractionEnabled=YES;
btn.frame=CGRectMake(20, 20, 40, 40);
[btn setTitle:@"button" forState:UIControlStateNormal];
[image addSubview:btn];
[self.view addSubview:image];
[btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
btn.userInteractionEnabled=NO;
// Do any additional setup after loading the view, typically from a nib.
}
-(void)click{
NSLog(@"btn被点击了");
}
这样,我们的UIImageView又可以响应事件了,原因是事件处理传递链向下传递了。
现在,在回到我们刚开始的问题,如何让btn响应的同时imageView也响应,我们这样做:
- (void)viewDidLoad {
[super viewDidLoad];
MyImageView * image = [[MyImageView alloc]initWithFrame:CGRectMake(60, 80, 200, 200)];
image.userInteractionEnabled=YES;
MyButton * btn =[UIButton buttonWithType:UIButtonTypeSystem];
btn.frame=CGRectMake(20, 20, 40, 40);
[btn setTitle:@"button" forState:UIControlStateNormal];
[image addSubview:btn];
[self.view addSubview:image];
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
btn.userInteractionEnabled=NO;
// Do any additional setup after loading the view, typically from a nib.
}
-(void)click:(UIButton *)btn{
NSLog(@"btn被点击了");
//响应链继续传递
[btn.nextResponder touchesBegan:nil withEvent:nil];
}
结果如下:
虽然最终,我们完成了这个需求,可是我建议你最好不要这么干,因为这样的逻辑是违背现实生活中人们的行为认知的,更重要的是,我们的项目最后也确实改掉了这样的逻辑~~~