本文系轉(zhuǎn)載,原文地址為iOS觸摸事件全家桶
iOS中鸣驱,除了UIResponder能夠響應(yīng)事件雇寇,手勢識別器赵颅、UIControl同樣具備對事件的處理能力虽另。當(dāng)這幾者同時存在于某一場景下的時候,事件又會有怎樣的歸宿呢饺谬?
拋磚引玉
場景界面如圖:
代碼不能再簡單:
- (void)viewDidLoad {
[super viewDidLoad];
//底部是一個綁定了單擊手勢的backView
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(actionTapView)];
[_backView addGestureRecognizer:tap];
//上面是一個常規(guī)的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?募寨?點不動族展??點歪了嗎拔鹰?仪缸?再點,還是沒反應(yīng)A兄恰画!我試著短按了一小會兒cell,依舊沒反應(yīng)4陕怼拴还!我不死心,長按了一會兒欧聘,didSelectRowAtIndexPath終于調(diào)了片林,還算給點面子 - -。然后我又點了下面的button怀骤,沒有任何問題费封。but what ?蒋伦?
為了搞清楚狀況弓摘,我自定義了相關(guān)的控件類,均重寫了4個響應(yīng)觸摸事件的方法以打印日志(每個重寫的觸摸事件方法都調(diào)用了父類的方法以保證事件默認(rèn)傳遞邏輯)痕届。
觀察各種情況下的日志現(xiàn)象:
現(xiàn)象一 快速點擊cell
backview taped
現(xiàn)象二 短按cell
-[GLTableView touchesBegan:withEvent:]
backview taped
-[GLTableView touchesCancelled:withEvent:]
現(xiàn)象三 長按cell
-[GLTableView touchesBegan:withEvent:]
-[GLTableView touchesEnded:withEvent:]
cell selected!
現(xiàn)象四 點擊button
-[GLButton touchesBegan:withEvent:]
-[GLButton touchesEnded:withEvent:]
button clicked!
如果上面的現(xiàn)象依舊能讓你舒心地抿上一口咖啡衣盾,那么恭喜你寺旺,本節(jié)的內(nèi)容已經(jīng)不適合你了。如果覺得一臉懵逼势决,那就繼續(xù)往下看吧~