2011-08-14 4 views
1

현재 Twitter (iPad) 유형 컨트롤을 다시 만들려고합니다. 대부분 온라인에서 사용할 수있는 모든 버전이 내가 개발중인 응용 프로그램 유형에 실제로 작동하지 않기 때문에 물론 더 잘할 수 있다고 생각합니다.) (그러나 생각보다 어렵습니다).nextResponder로 터치 기본보기

내가 원하는 것은 : 내가 제어

  • 내가 사용 주로하기 때문에 (내 컨트롤에서 사용하고자 할 때 내 현재 뷰 컨트롤러를 변경할 필요가 없습니다에 추가 뷰 컨트롤러의

    • 유연한 위치 iPhone 및 iPad 버전의보기 컨트롤러).
    • 뷰 컨트롤러를 드래그 할 수 있지만 여전히 뷰 컨트롤러에서 모든 기능을 유지합니다.

    내가 현재 가지고 무엇 : 그들은 내 컨트롤에 추가됩니다 뷰 컨트롤러에

    • 좋은 위치. 내가 설정 한 규칙에 따라, 주위에 내가있는 UITableViewController를 추가 할 때, 나는 주위를 드래그 할 수있을 것인지 (등 최대 x 위치)

    내 문제를 뷰 컨트롤러를 드래그

  • 가능 AND 테이블에서 셀을 스크롤하고 선택하는 기능을 유지하십시오.

    내 현재 솔루션은보기 컨트롤러가 내 컨트롤에 추가 될 때 모든 터치를 허용하는 서브 뷰를 뷰 컨트롤러와 동일한 크기로 추가한다는 것입니다. 이 벤트는 대리자를 사용하고 메서드를 호출하여 컨트롤로 전송됩니다. 이것은 잘 작동, 내 UITableViewController에 하위 뷰를 추가 할 때 이상한 동작이 있음을 인정합니다. 위아래로 스크롤하는 것은 UITableViewController에서 여전히 작동하지만 이러한 터치는 UITableViewController의 상단에서보기로 감지되지 않습니다. 테이블에서 셀을 선택하면 더 이상 작동하지 않습니다. 오버레이 UIView가 이러한 접촉을 수행하기 때문입니다.

    나는이 같이있는 UITableViewController에 오버레이에 UIView를 추가

    SNOverlayView* layover = [[SNOverlayView alloc] initWithFrame:CGRectMake(0,0, controllerWidth, self.frame.size.height)]; 
    layover.delegate = self; 
    [controller.view addSubview:layover]; 
    [layover release]; 
    

    내 사용자 정의 오버레이 UIView의 모든 터치에 대한 다음 방법 중 몇 가지를 포함 방법 (시작 취소, 종료 및 이동) :

    - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
    if ([delegate respondsToSelector:@selector(overlayTouchesBegan:touches:event:)]) 
        [delegate overlayTouchesBegan:self touches:touches event:event]; 
    
        NSLog(@"%@", self.nextResponder); 
    
        [self.nextResponder touchesBegan:touches withEvent:event]; 
    } 
    

    문서에서 알 수 있듯이 nextResponder를 호출하면 내보기 아래의 TableView도 접촉을 수신해야합니다. 그러나 이러한 방법은 화면을 터치하거나 옆으로 밀면 트리거됩니다. 위쪽에서 아래쪽으로 슬라이딩하면 이러한 메서드가 트리거되지 않으며 셀을 건드리지 않아도 UITableViewController에서 didSelectRowAtIndexPath가 트리거되지 않습니다. 이 메소드의 self.nextResponder는 UITableView입니다 (이 메소드의 NSLog가 출력 함).

    나는 nextResponder 부분을 오해하고 있습니까? 내 UITableViewController를 수정하지 않을 때 이것이 가능하지 않습니까?

    편집 :

    |- Root UIView (1) 
    |-- Containment UIView which detects touches (2) 
    |---- UITableViewController (3) 
    

    문제는 지금 내 봉쇄보기 (2) 터치를 감지하지 않는다는 것입니다 : 내가 모든 ViewControllers을 포함하는 내 주요 UIView의 추가 구조를 업데이트.나는 그것을 더 아래에 언급 된 구조처럼 만들어 내 코드를 업데이트하려고합니다

    |- Root UIView (1) 
    |-- Containment UIView (2) 
    |---- UIView detecting touches (4) 
    |---- UITableViewController (3) 
    

    하지만 내가 접촉을 감지 할 수있는 UIView를 얻을 수있는 방법을 모르겠습니다. UITableViewcontroller (3)을 UIView (2)에 추가하면 UIView가 터치 (4)를 감지하여 터치를 '훔치는'맨 위에 놓이기 때문입니다. 나는 오히려 (4)와 (3)의 순서를 바꿀 것이다.

  • +0

    적절한 형식을 사용하십시오. 그리 어렵지 않습니다. – vikingosegundo

    +0

    알아, 문제는 내가 다른 나라에서 내 아이폰 에서이 게시됩니다. 죄송합니다. –

    답변

    1

    UITableView에 하위보기를 추가하고 있습니까? 이는 셀 (UITableView는 UIScrollView의 하위 클래스 임)로 스크롤하고 UITableView가 하위 뷰를 추가 및 제거하기 때문에 위험하므로 뷰가있는 순서를 제어 할 수 없습니다.

    나는, 내가 UIScrollViews이 (다른 UIViews에 즉하지 touchesBegan을 접촉을 잡아에 대해 다른 방법을 사용하는 것이 의심이있어 가장 좋은 건 말했다되고 그건이

    - containerView (plain UIView, that your UIViewController loads) 
    |-- overlayView (catches touches) 
    |-- UITableView 
    

    같은 뷰 계층을 가지고있을 거라고 생각 : 등).

    +0

    UITableViewController에 하위보기를 추가하고 있습니다. 이제 구조가 바뀌 었습니다. 내 게시물을 구조로 업데이트했습니다. –

    +0

    터치 감지보기가 테이블보기 앞에 있어야합니다. 이 터치 감지 뷰의 다음 응답자는 더 이상 테이블 뷰가 아니므로 tableview에 대한 참조를 유지하고 터치 이벤트를 전달합니다. – joerick

    관련 문제