2012-10-03 1 views
1

두 개의 다른 위치에 두 개의 레이블이 있습니다. 두 개의 레이블이 동시에 탭될 때 다른 레이블에 성공 메시지가 표시되기를 원합니다.UIGestureRecognizer를 통해 동시에 두 지점의 탭을 처리하십시오.

See image:

나는이 문제를 어떻게 달성합니까? 하나의 손가락 또는 두 손가락으로 터치하는 것을 인식 할 수 있지만 다른 시나리오입니다. 도와주세요. 나는 이것을 시도했지만 효과가 없다.

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
     tapRecognizer.numberOfTapsRequired = 1; 
     tapRecognizer.numberOfTouchesRequired = 2; 
     tapRecognizer.delegate = self; 
     [self.view addGestureRecognizer:tapRecognizer]; 

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if (touch.view == tap2 && touch.view == tap1) 
    { 
     result.text = @"success"; 
    } 
    return YES; 
} 

미리 감사드립니다.

답변

0

공식적으로 내가 받아 들였다 TERMES 년대 먼저 대답하고도 일했다, 그러나 나는이 과정에 대한보다 간단한 해결책을 발견했다. 두 개의 제스처 인식기가 필요하지 않으며, 터치 횟수가 2 회인 간단한 탭 제스처 인식기로 달성 할 수 있습니다.

UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)]; 
    tapRecognizer.numberOfTapsRequired = 1; 
    tapRecognizer.numberOfTouchesRequired = 2; 
    tapRecognizer.delegate = self; 
    [self addGestureRecognizer:tapRecognizer]; 

지금, 핸들 탭 방식에서 우리는 쉽게 "locationOfTouch:inView:"UIGestureRecognizer 클래스의 인스턴스 방법으로 두 개의 터치 포인트를 얻을 수 있습니다 여기에 코드입니다. 따라서 handleTap: 메서드에서 두 개의 터치 점이 원하는 위치에 있는지 확인해야합니다. 코드는 다음과 같습니다.

-(void)handleTap:(UITapGestureRecognizer*)recognizer 
{ 
    if (recognizer.state == UIGestureRecognizerStateEnded) 
    { 
     CGPoint point1 = [recognizer locationOfTouch:0 self]; 
     CGPoint point2 = [recognizer locationOfTouch:1 self]; 

     if ([self validateTapIn:point1 and:point2]) 
     { 
      resultLabel.text = @"success"; 
     } 
    } 
} 

-(BOOL)validateTapIn:(CGPoint)point1 and:(CGPoint)point2 
{ 
    return 
    (CGRectContainsPoint(label1.frame, point1) && CGRectContainsPoint(label2.frame,:point2)) || 
    (CGRectContainsPoint(label1.frame, point2) && CGRectContainsPoint(label2.frame, point1)); 
} 
2

감지하려는 것은 실제로 단일 제스처가 아닙니다.

각 제스처 인식기를 각 버튼에 추가하는 것이 좋습니다. 핸들러 것 :

  1. 스토어 (핸들러가 호출되는 순간) 탭의 시간이
  2. 다른 버튼을 마지막으로 도청 된 시간이 시간을 비교. 시간이 매우 비슷하다면 (아마도 0.25 초 간격으로), 은 동시에 두 번 탭 했으므로 그에 따라 으로 반응한다고 생각하십시오.

이상적인 금액을 찾으려면 실제 장치에서 시간 간격으로 재생하십시오.

UPDATE : 분명히 어떤 방식으로 테스트되지 않았습니다

코드 조각 : self.button1TapTime 및 self.button2TapTime는 멤버 변수 (더블)입니다

- (void)handleButton1Tap:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     self.button1TapTime = CACurrentMediaTime(); 
     [self testForSimultaneousTap]; 
    } 
} 

- (void)handleButton2Tap:(UITapGestureRecognizer *)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     self.button2TapTime = CACurrentMediaTime(); 
     [self testForSimultaneousTap]; 
    } 
} 

- (void)testForSimultaneousTap 
{ 
    if (fabs(self.button1TapTime - self.button2TapTime) <= 0.2) 
    { 
     // Do stuff 
    } 
} 

.

+0

대답에 감사드립니다. 코드 스 니펫으로 조금 더 도와 주시겠습니까? 그게 정말 도움이 될 것입니다 :) 당신은 맞춤형 제스처 인식기를 사용한다면 덜 복잡 할 것이라고 생각합니까? 의견을 보내주십시오. – Shabib

+1

코드 스 니펫을 추가했습니다. (실제로 나는 자신을 관리 할 수 ​​있다고 생각합니다.). 사용자 정의 제스처는 복잡하며이 경우 두 개의 서로 다른보기에서 탭 동작을 실제로 감지 한 이후 부적절합니다. 어느 것이 제스처를 첨부합니까? – tarmes

+0

대단히 감사합니다, 귀하의 솔루션이 작동하고 당신은 절대적으로 바로 사용자 정의 제스처에 대한 필요가 없습니다 :) 다시 한번 감사드립니다 :) – Shabib

관련 문제