2012-10-03 46 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

我正式接受了泰爾梅的回答第一和工作過,但我已經找到了一個更簡單的解決方案這一進程。沒有必要使用兩個手勢識別器,只需輕觸手勢識別器即可實現,觸摸次數爲兩次。下面是代碼:

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:

該顯然還沒有被以任何方式進行測試的代碼段:

- (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 
    } 
} 

其中self.button1TapTime和self.button2TapTime是成員變量(雙打)。

+0

謝謝蒂姆回答,你可以請幫忙多一點與代碼段?這將是非常有用的:)如果我去定製手勢識別器,你認爲它會更簡單嗎?請提供您的反饋。 – Shabib

+1

添加了一段代碼(儘管我真的認爲你可以自己管理它!)。自定義手勢很複雜,在這種情況下完全不合適,因爲您在兩個不同的視圖上真正檢測到輕敲手勢 - 您會將手勢附加到哪個手勢上? – tarmes

+0

非常感謝你蒂姆,你的解決方案確實工作,你是絕對正確的沒有需要定製的手勢:)再次感謝:) – Shabib

相關問題