2013-07-14 5 views
1

사용자가 contentView을 누르는 경우 closeShareView이 호출되는 것을 원하지 않습니다. modalView에서만 어떻게 할 수 있습니까?Subview에서 UITapGestureRecognizer를 사용하지 못하도록

UIWindow* mainWindow = (((AppDelegate *)[UIApplication sharedApplication].delegate).window); 

// Modal view 
UIView *modalView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
modalView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.8f]; 

// Content view (goes inside modalView) 
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(modalView.center.x, modalView.center.y, 220, 220)]; 
[modalView addSubview:contentView]; 
[mainWindow addSubview:modalView]; 

// Tap gesture (added to modalView) 
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeShareView:)]; 
gr.numberOfTapsRequired = 1; 
[modalView addGestureRecognizer:gr]; 

답변

1

"콘텐츠보기 외부를 클릭하면 모달을 해제합니다"와 같은 종류의 거래가 필요합니까?

모달보기 전체에 탭 제스처를 추가하는 대신,이를 처리하는 배경보기를 가지고 콘텐츠보기가 자연스럽게 모든 탭을 가로 챌 것입니다 (사용자 상호 작용이 활성화 된 경우). 기본적으로 코딩을해라.

UIWindow* mainWindow = (((AppDelegate *)[UIApplication sharedApplication].delegate).window); 

// Modal view 
UIView *modalView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

// Background tap view 
UIView *backgroundView = [[UIView alloc] initWithFrame:modalView.bounds]; 
backgroundView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.8]; 
[modalView addSubview:backgroundView]; 

// Content view (goes inside modalView) 
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(modalView.center.x, modalView.center.y, 220, 220)]; 
[modalView addSubview:contentView]; 
[mainWindow addSubview:modalView]; 

// Tap gesture (added to backgroundView) 
UITapGestureRecognizer *gr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeShareView:)]; 
gr.numberOfTapsRequired = 1; 
[backgroundView addGestureRecognizer:gr]; 
+0

모달을

그런 다음 같은 것을 사용 보기는 그 배경보기입니다. 사용자 상호 작용이 활성화 된 경우에도 탭은 여전히 ​​하위보기에서 인식됩니다. – siburb

+0

모달 뷰는 배경 뷰일뿐만 아니라 부모 뷰입니다. 부모 뷰에 제스처 인식기를 추가하면 처리 할 수 ​​있지만 물론 작동하지 않습니다. 그래서 다른 뷰의 UIView ''(또는''UIControl''을''게으른 느낌 ''이라면''modalView''에''contentView' 뒤에 숨어 있어야합니다. – Can

+0

나는 문자 그대로 새로운 프로젝트에 코드를 붙여 넣고 복사했다. (나 역시 놀랐다 : D). – Can

3

먼저 헤더 파일의 UIGestureRecognizerDelegate 프로토콜을 준수하십시오.

의 대표self으로 설정하십시오.

그런 다음 서브 뷰의 태그을 설정하십시오. ~ 100 (하지만 상수를 사용해야합니다). 그렇지 않으면이 서브 뷰가 그리고 제스처 시작하지 말아야

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    CGPoint point = [gestureRecognizer locationInView:self.view]; 
    UIView *viewTouched = [self.view hitTest:point withEvent:nil]; 
    if (viewTouched.tag == 100) { 
     // Don't BEGIN the gestureRecognizer 
     return NO; 
    } else { 
     // Do BEGIN the gestureRecognizer 
     return YES; 
    } 
} 
0

난 그냥 만져보기자가 있는지 확인하고 있습니다 :

func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { 
    let point = gestureRecognizer.locationInView(self.view) 
    if let viewTouched = self.view.hitTest(point, withEvent: nil) where viewTouched != self.view { 
     return false 
    } else { 
     return true 
    } 
} 
관련 문제