UIGestureRecognizer在多層視圖中的觸發問題

在一個superview中,添加了一個subview。tap一下superview,將subview隱藏起來。
在視圖superview添加一個UITapGestureRecognizer對象,在UITapGestureRecognizer對象的action中實現隱藏subview的邏輯代碼。

UIView *superview = [[UIView alloc] initWithFrame:CGRectMake:(0, 0, 320, 480); 
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake:(100, 100, 100, 100); 
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(handleTap); 
[superview addGestureRecognizer:recognizer]; 
[self.view addSubview:superview]; 
[superview addSubview:subview];

代碼很簡單,tap一下superview視圖,果然就隱藏了subview。但是,我tap一下subview視圖,它也隱藏了subview。

基於對hitTest:withEvent:調用過程的理解,我們知道hit是在多層view上傳遞的。

我想到在subview也加一個UITapGestureRecognizer,將這個tap操作截獲,處理掉,這樣就不會傳到superview上,就不會調用superview上的UITapGestureRecognizer的動作handleTap。

這個方法雖然能用,但也太笨了,無緣無故做一個操作,還要維護一個方法。笨!!!


其實,UIGestureRecognizer是有delegate設置的,能對每一個UITapGestureRecognizer的對象進行對應處理。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
  CGPoint touchPoint = [touch locationInView:self.view]; 
 return !CGRectContainsPoint(subview.frame, touchPoint); 
 }
 
完全可以對每一個tap操作touchPoint進行判斷,如果touchPoint 在subview上,完全可以返回False,讓UIGestureRecognizer不做任何操作,不觸發其action。該方法的默認返回值爲True。

記住,recognizer的delegate的屬性值要設置爲self,纔會調用這個方法。
recognizer.delegate = self;

在iOS中,很多類都有delegate設置,可以用來實現這類邏輯判斷。iOS的架構設計得真的很好,真心讚一句!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章