本文系转载,原文地址为iOS触摸事件全家桶
iOS中,除了UIResponder能够响应事件,手势识别器、UIControl同样具备对事件的处理能力。当这几者同时存在于某一场景下的时候,事件又会有怎样的归宿呢?
抛砖引玉
场景界面如图:
image代码不能再简单:
- (void)viewDidLoad {
[super viewDidLoad];
//底部是一个绑定了单击手势的backView
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionTapView)];
[_backView addGestureRecognizer:tap];
//上面是一个常规的tableView
_tableMain.tableFooterView = [UIView new];
//还有一个和tableView同级的button
[_button addTarget:self action:@selector(buttonTap) forControlEvents:UIControlEventTouchUpInside];
}
- (void)actionTapView{
NSLog(@"backview taped");
}
- (void)buttonTap {
NSLog(@"button clicked!");
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"cell selected!");
}
然后我像往常一样怀揣着吃奶的自信点击了cell。what??点不动??点歪了吗??再点,还是没反应!!我试着短按了一小会儿cell,依旧没反应!!我不死心,长按了一会儿,didSelectRowAtIndexPath终于调了,还算给点面子 - -。然后我又点了下面的button,没有任何问题。but what ??
为了搞清楚状况,我自定义了相关的控件类,均重写了4个响应触摸事件的方法以打印日志(每个重写的触摸事件方法都调用了父类的方法以保证事件默认传递逻辑)。
观察各种情况下的日志现象:
现象一 快速点击cell
backview taped
现象二 短按cell
-[GLTableView touchesBegan:withEvent:]
backview taped
-[GLTableView touchesCancelled:withEvent:]
现象三 长按cell
-[GLTableView touchesBegan:withEvent:]
-[GLTableView touchesEnded:withEvent:]
cell selected!
现象四 点击button
-[GLButton touchesBegan:withEvent:]
-[GLButton touchesEnded:withEvent:]
button clicked!
如果上面的现象依旧能让你舒心地抿上一口咖啡,那么恭喜你,本节的内容已经不适合你了。如果觉得一脸懵逼,那就继续往下看吧~
网友评论