2012-03-14 74 views
0

我有兩個滑動手勢識別器的視圖。一左一右。限定觸摸事件以查看

在這個視圖的頂部,我有另外兩個滑動手勢識別器的視圖。

我的問題是,我對第二個視圖做的任何刷卡也會發送到父視圖。

我該如何預防? 而且,如何防止在子視圖B中觸發的觸摸事件發送到父視圖A?

謝謝!

ps。對不起,如果這個問題以前問過..我之前問了一堆東西,但沒有工作..

回答

0

這可以很容易地完成與UIGestureRecognizercancelsTouchesInView屬性。在子視圖的識別器上將其設置爲YES,這應該防止手勢傳播到父視圖。

+0

如果我在子視圖中沒有任何手勢或觸摸識別器,該怎麼辦?我只是希望能夠按下按鈕並滾動而不觸發父母視圖識別器。 – 2012-03-15 00:09:43

+0

有趣。我認爲你應該可以重寫子視圖中的touchesBegan方法來處理這個問題,但是在玩了幾分鐘後,我還沒有找到一個可行的解決方案。這個答案可能是你需要的http://stackoverflow.com/a/5234804/144755 – oltman 2012-03-15 16:39:36

+0

謝謝你oltman。 – 2012-03-16 13:21:22

0

我剛剛完成了可能會幫助其他人遇到此線程的解決方法。

基本前提是捕捉觸摸發生時的情況,並在觸摸發生在一組視圖內時刪除手勢。然後在手勢識別器處理手勢後重新添加手勢。

@interface TouchIgnorer : UIView 
@property (nonatomic) NSMutableSet * ignoreOnViews; 
@property (nonatomic) NSMutableSet * gesturesToIgnore; 
@end 
@implementation TouchIgnorer 
- (id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     _ignoreOnViews = [[NSMutableSet alloc] init]; 
     _gesturesToIgnore = [[NSMutableSet alloc] init]; 
    } 
    return self; 
} 
- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGPoint relativePt; 
    for (UIView * view in _ignoreOnViews) 
    { 
     relativePt = [view convertPoint:point toView:view]; 
     if (!view.isHidden && CGRectContainsPoint(view.frame, relativePt)) 
     { 
      for (UIGestureRecognizer * gesture in _gesturesToIgnore) 
      { 
       [self removeGestureRecognizer:gesture]; 
      } 
      [self performSelector:@selector(rebindGestures) withObject:self afterDelay:0]; 
      break; 
     } 
    } 
    return [super pointInside:point withEvent:event]; 
} 

- (void) rebindGestures 
{ 
    for (UIGestureRecognizer * gesture in _gesturesToIgnore) 
    { 
     [self addGestureRecognizer:gesture]; 
    } 
} 
@end