2014-04-15 2 views
1

최근 스 와이프 할 수있는 수퍼 뷰와 스 와이프해야하는 하위 뷰가있는 문제가 생겼습니다. 상호 작용은 스 와이프가 경계 내에서 발생한 경우 하위보기 만 스 와이프해야한다는 것입니다. 스 와이프가 하위보기 외부에서 발생한 경우 수퍼 뷰가 스 와이프를 처리해야합니다.부모보기에서 제스처를 무시합니다.

나는이 정확한 문제를 해결하는 해답을 찾지 못했고, 다른 사람들에게 도움이 될 수 있다면 게시하겠다고 생각한 해킹 해결책을 찾았다.

편집 : 더 나은 해결책이 이제 올바른 대답으로 표시되었습니다.

답변

1

, 당신은 부모 뷰 인식기의 터치를 무시 gestureRecognizer:shouldReceiveTouch: 위임 방법을 사용할 수 있습니다.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
     shouldReceiveTouch:(UITouch *)touch{ 
    UIView* swipeableSubview = ...; //set to the subview that can be swiped 
    CGPoint locationInSubview = [touch locationInView:swipeableSubview]; 
    BOOL touchIsInSubview = [swipeableSubview pointInside:locationInSubview withEvent:nil]; 
    return !touchIsInSubview; 
} 

이렇게하면 스 와이프가 스 와이프 가능한 하위보기에서 시작되지 않으면 부모가 스 와이프 만 받도록합니다.

+0

지금 사용해 보겠습니다. – DrDisc

+0

훨씬 나은 해결책입니다. 훨씬 깨끗하고 덜 해킹 된 것 같습니다. 무엇보다 잘 작동합니다! – DrDisc

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 
관련 문제