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的架構設計得真的很好,真心贊一句!


 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM