2014-06-24 3 views
4

iOS5에서 UIViewController 봉쇄를 여러 곳에서 UITouchGesture을 구현 한 앱 전체에 사용합니다.iOS 뷰 컨트롤러 포함 | 하위보기 컨트롤러가 부모보기 컨트롤러로 전달됩니다.

어린이를 추가 할 때 ViewController (전체 화면) 터치는 해당 부모에게 전달됩니다.

무엇이 있다면,이 문제를 해결할 수있는 솔루션은 무엇입니까? 나는 MPFlipViewController을 사용하고 사용자가 자식을 손가락으로 움직일 때 어린이 밑으로 넘기는 페이지를 볼 수 있습니다. ViewController.

설명을 위해, 나는 다음과 같이 자식으로 내의 ViewController를 추가

[self addChildViewController:vc]; 
[vc willMoveToParentViewController:nil]; 
[self.container addSubview:vc.view]; 
[vc didMoveToParentViewController:self]; 

컨테이너는 단지 childViewController & 다른 UIView의 개체의보기에 앉아 것을 단지의 UIView입니다. 감사합니다.

답변

6

당신은 그것을 거꾸로 가지고 있습니다. 컨트롤러 포함 (containment)은 하나의 것이지만, 이는 표준 뷰 계층 구조 및 응답 체인 사물 일뿐입니다. 따라서 터치는 처음에 부모에게 전송됩니다. 특히 해당 뷰의 -(UIView *)hitTest:withEvent:에 대한 호출이 이루어집니다. 자식 뷰가 있으면이를 반환합니다. 그렇지 않으면 자신의 뷰 중 하나를 반환합니다. 아마도 그것은 자신을 반환합니다.

부모 컨트롤러가 터치를 캡처 한 경우 해당 터치가 자식에게 전송 된 적이 없음을 의미합니다. 그것은 아이에게 보내지고 부모에게 올라가는 것이 아닙니다.

부모가 터치 캡처로 비정상적인 작업을 수행하려면 사용자 정의보기를 사용하고 자신 만의 -hitTest:withEvent:을 구현하십시오. 첫 번째 단계로 그렇게하고 입력을 기록하여 어떤 일이 발생하는지 확인하십시오.

+0

필자는 ViewController를 하위 뷰 컨트롤러로 추가하여 자신의 감정을 여전히 부모의 UIView 개체로 전달하는 자식 뷰 컨트롤러를 뷰어에 추가하여 자신의 표준 View Hierachy 항목을 수정하지 않았습니다. – theiOSDude

+1

그 방향으로 터치를 수동으로 전달하지 않으면 UIKit 작동 방식이 아닙니다. 터치 아래에서 가장 로컬 뷰를 찾는 검색은 최상위 뷰에서 아래쪽으로 내려갑니다. 부모부터 자식까지. 그 반대도 마찬가지입니다. 컨트롤러 포함은 기본 뷰 관리에 추가되며 기본 사항을 변경하지 않습니다. 어떻게 만지작 거리는 모습이 발견됐다고 생각하니? – Tommy

1

iOS 7이 출시되기 전에는 불가능합니다. 지금은 어떤 전문가들도이 작업을 완료하고 싶습니다.

+0

그래서 iOS7에서 그 작업을 중단하려면 어떻게해야합니까? Thnx – theiOSDude

1

하위보기 컨트롤러에 대한 터치 처리를 구현해야합니다. 자녀가 모든 터치 이벤트를 캡처 한 다음 부모 이벤트로 전달되지 않도록 드롭합니다.

또 다른 해결책은 무료로 문제를 일으킬 수있는 UINavigationController의 하위보기 컨트롤러를 래핑하는 것일 수 있습니다.

부모보기 컨트롤러에서 UITouchGesture 코드를 게시하는 것이 도움이 될 수 있습니다.

1

MPFlipViewController.m에서는이 방법을보고해야합니다

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

변경은 뭔가 물론 GestureRecognizerOfYourChildViewController 당신의 아이 뷰 컨트롤러의 제스처 인식기입니다

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    // don't recognize simultaneously with scroll view gestures in content area 
    if ([[otherGestureRecognizer view] isKindOfClass:[UIScrollView class]]) 
     return NO; 

    if (otherGestureRecognizer == GestureRecognizerOfYourChildViewController) 
     return NO; 

    // Allow simultanoues pan & swipe recognizers 
    return YES; 
} 

처럼.

ED : 자신의 자식보기 컨트롤러에서 OP가 제스처 인식기를 사용하지 않기 때문에 솔루션이 약간 다릅니다. 비슷한 문제가있는 다른 사람들에게 도움이 될 수 있기 때문에 여기서 첫 번째 버전을 남겨 둘 것입니다.내가 여기 생각할 수

가장 좋은 방법은 당신이 그 위에 표시되는 아이 뷰 컨트롤러가있을 때 MPFlipViewController에 gestureRecognizers을 비활성화하고 아이 뷰 컨트롤러를 제거하고 MPFlipViewController 다시 정상에있을 때 다시 활성화해야한다는 것입니다. 이를 위해 enabled 속성을 사용하십시오.

제스처 인식기는 자신의보기 컨트롤러에서 사용하는 "터치 체인"외부에서 작동하기 때문에 문제가 발생합니다.

+0

감사합니다. 내 질문을 약간 수정했습니다. ChildViewController에서 제스처 인식기를 사용하지 않고 사용자가 단순히 자식 뷰의 화면에 손가락을 배치하고 부모의 MPFlipViewController가 터치를 흡수하고 ' page ' – theiOSDude

+0

답변을 업데이트했습니다. 하지만 자식보기 컨트롤러가받은 접촉에 반응합니까? – johnyu