2011-12-18 4 views
0

두 개의 하위 뷰 (다른 하나의 상단 (topChild) 중 하나 (bottomChild))가있는 뷰 (parent)가 있습니다.형제 하위 뷰는 iPhone에서 접촉하지 않습니다.

화면을 탭하면 topChildparent 만 터치 이벤트를 수신합니다.

터치 이벤트를 bottomChild으로 전파하려면 어떻게해야합니까?

코드 : MYViewtouchesBegan를 기록 UIView의 서브 클래스가

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    MYView* parent = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    parent.tag = 3; 
    parent.backgroundColor = [UIColor redColor]; 

    MYView* bottomChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 90, 90)]; 
    bottomChild.tag = 2; 
    bottomChild.backgroundColor = [UIColor blueColor]; 
    [parent addSubview:bottomChild]; 

    MYView* topChild = [[MYView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; 
    topChild.tag = 1; 
    topChild.backgroundColor = [UIColor greenColor]; 
    [parent addSubview:topChild]; 
    [self.view addSubview:parent]; 
} 

.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"%d", self.tag); 
    [super touchesBegan:touches withEvent:event]; 
} 

결과 :

TouchTest[25062:f803] 1 
TouchTest[25062:f803] 3 

내 첫번째 생각은 parent이 아이들에게 모든 touchesSomething 통화를 전파하는 것이었다 :

enter image description here

녹색 영역을 터치하면 다음과 같은 로그를 생성 하지만 (A) 더 쉬운 해결책이있을 거라고 생각합니다. n 및 (B) 어떤 자녀가 부모에게 이벤트를 보냈는지 모르겠으며 같은보기에 두 번 메시지 을 보내면 속임수가 발생할 수 있습니다.

질문을 한 후 나는이 post을 찾은 후 hitTest을 덮어 쓰면 터치를받는보기가 변경됩니다. 이 접근법을 시도하고 그것이 효과가 있다면 질문을 업데이트 할 것입니다.

답변

1

당신이 가지고있는 흥미로운 문제는 아마도 구조화 된 방식을 다시 생각해 볼 때 가장 좋은 것입니다. 하지만 현재 상위 뷰에서 터치 이벤트를 잡아 내야한다고 제안하는 방식대로 작동하게하려면 부모에게 전달한 다음 상위 뷰의 모든 하위 뷰를 통해 하위 이벤트를 전파하십시오. 이 작업을 수행하려면 touchesBegan: (또는 터치를 가로 채기 위해 사용하는 다른 방법)을 사용하여 모든보기에서 아무 것도하지 않고 부모보기에서 호출하는 메서드에서만 작업을 수행해야합니다.

뷰에서 터치를 처리하지 않고 부모 뷰 뷰에 알림을 보낸 다음 원하는대로 효과를 발생시키는 데 필요한 하위 뷰 메서드를 호출한다는 것은 정말 다른 방법입니다.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // Do nothing, parent view calls my parentNotifiedTouchesBegan method 
    [self.superview touchesBegan:touches withEvent:event]; 
} 

- (void) parentNotifiedTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // Act on the touch here just as my sibling views are doing 
} 

참고 그 코드 self.superviewsuper을 변경했습니다. 자신이하는 일에 따라 super의 방법으로 전화하기를 원할 수도 있고 안할 수도 있으며, 전화 할 곳은 parentNotifiedTouchesBegan 일 수 있습니다.

물론 서브 이벤트가 이벤트를 보냈는지 알 수 있습니다. 사용자 정의 메소드를 사용하여 touchesBegan:을 호출하는 대신 superview에 알립니다. self 인수를 사용하십시오. 당신이 아이들의 접촉이 필요하지 않은 경우

+0

감사 아담을 설정! 이 솔루션은 제스처 인식기와 호환 될 수 있습니까?언뜻 보면이 길로 가면 휠을 다시 구현해야합니다. – hpique

+0

그리고 나는 물건을 재 구조화하는 것을 아주 좋아할 것이지만, 나의 경우에는 어떻게 보이지 않습니다. topChild는 투명도를 가지고 있습니다. topChild와 bottomChild는 "움직일"수 있습니다 (따라서 topChild는 bottomChild의 하위 뷰일 수 없습니다). 둘 다 접촉에 응답해야합니다. – hpique

+0

콜백에 의해 수신 된 gestureRecognizer 객체를 간단한 터치가 아닌 부모에게 전달하는 것이 가능해야합니다. 적어도이 프로젝트에서는 UIPinchGestureRecognizer에서 유용 할 것입니다. –

0

bottomChild.userInteractionEnabled = NO; 
topChild.userInteractionEnabled = NO; 
관련 문제