2011-08-10 14 views
2

私はすでにMKMapViewで使用されているものに加えて、独自のジェスチャ認識機能を実装しようとしています。今、私は地図をタップしてピンを設定することができます。この動作は私のUITapGestureRecognizerによって実現されます。すでに存在するピンをタップすると、ジェスチャ認識機能は何も行いませんが、代わりにこのピンのコールアウトバブルが表示されます。 UIGestureRecognizerDelegateは次のようになります。iPhone:MKMapViewを別のUITapGestureRecognizerと組み合わせる

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 
{ 
    if (gestureRecognizer == self.tapRecognizer) 
    { 
     bool hitAnnotation = false; 
     int count = [self.mapView.annotations count]; 
     int counter = 0; 

     while (counter < count && hitAnnotation == false) 
     { 
      if (touch.view == [self.mapView viewForAnnotation:[self.mapView.annotations objectAtIndex:counter]]) 
      { 
       hitAnnotation = true; 
      } 
      counter++; 
     } 
     if (hitAnnotation) 
     { 
      return NO; 
     } 

    } 
    return YES; 
} 

これは問題なく動作します。私の唯一の問題は、ピンとダブルタップのコールアウトバブルです。通常はダブルタップがズームインに使用されます。これはまだ機能しますが、これに加えて、新しいピンも取得します。これを避ける方法はありますか?

その他の問題は、ピンのコールアウトバブルで発生します。私はこの場所(上記のコードを参照)に新しいピンを設定せずにピンをタップすることでバブルを開くことができますが、私はそれをタップしてバブルを閉じたいとき、別のピンが設定されます。私の問題は、ユーザーがコールアウトバブルをタップした場合、touch.viewで確認できないということです。これは私が知る限り、通常のUIViewではないからです。この問題のアイデアや回避策はありますか? MKMapViewでシングルタップから、ダブルタップを区別する:

おかげ

答えて

4

は、私はあなたの最初の問題と同じ問題を抱えていました。私がやったことは以下の通りであった:その後、

[doubleTapper release]; 
doubleTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapDoubleTapped:)]; 
doubleTapper.numberOfTapsRequired = 2; 
doubleTapper.delaysTouchesBegan = NO; 
doubleTapper.delaysTouchesEnded = NO; 
doubleTapper.cancelsTouchesInView = NO; 
doubleTapper.delegate = self; 

[mapTapper release]; 
mapTapper = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(mapTapped:)]; 
mapTapper.numberOfTapsRequired = 1; 
mapTapper.delaysTouchesBegan = NO; 
mapTapper.delaysTouchesEnded = NO; 
mapTapper.cancelsTouchesInView = NO; 
[mapTapper requireGestureRecognizerToFail:doubleTapper]; 

と、次のデリゲートメソッド実装:requireGestureRecognizerToFail:を使用して

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    return YES; 
} 

をアプリがダブルタップからシングルタップを区別することを可能にするとgestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:を実装するダブルタップが残っていることを保証しますMKMapViewに転送され、通常のズームが継続されます。 doubleTapperは実際には何もしません(私の場合は、ログデバッグメッセージを除いて)。ダブルタップからシングルタップを分離するのに役立つダミーのUIGestureRecognizerです。

+0

こんにちは、あなたの答えはありがとうございます。これは正しい方向に私を指摘した。最初の問題は解決されるようです。 2番目の問題について何か提案がありますか? – Lars

関連する問題