3

私には習慣がありますMKAnnotationView。そのsetselected:animated方法では、ペン先からロードされたカスタム バブルを追加し、このビューを含めるように注釈ビューのフレームを調整し、このように注釈円を他の色で再描画します (最初 - 選択されていない、2 番目 - 選択されている、青 - フレーム、緑 - アルファ = 0.8 のカスタム バブル ビュー、赤 - 注釈ビュー):

ここに画像の説明を入力

正常に動作し、バブルが表示され、その外側をタップするだけで「閉じる」ことができます (これがフレームを増やした理由です)。このバブルにはいくつかのボタンがあり、マップだけの注釈の下に何もない場合はクリックできます。

しかし、吹き出しの下に別の注釈がある場合は、吹き出し全体をクリックして「スルー」できます。ボタンの 1 つをタップすると、タップのハイライトが表示されますが、別の注釈が選択されてしまいdidSelectAnnotationViewます...

バブルを不透明/半透明にしようとしましたが、うまくいきませんでした。ビュー自体で、ボタンにexclusiveTouchを設定すると、うまくいきません。フレームをいじらないようにしましたが、それでもクリックスルーできます。何か不足していますか?

ありがとう

編集:より短い:この UIView の下に他の MKAnnotationView がある場合、 MKAnnotationView にUIView追加されたものをクリックできるのはなぜですか?addSubview

詳細 :

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
  if(selected)
  {
    initialFrame = self.frame;       // save frame and offset to restore when deselected
    initialOffset = self.centerOffset;  // frame is correct for a circle, like {{2.35, 1.47}, {12, 12}}

    if (!self.customCallout) 
    {
      self.customCallout = [[[NSBundle mainBundle] loadNibNamed:@"CustomCallout" owner:self options:nil] objectAtIndex:0];
    }
    // adjust annotationview's frame and center
    // callout is 200x120, here frame is {{2.35, 1.47}, {200, 132}} 
    self.customCallout.layer.cornerRadius=5;
    self.customCallout.exclusiveTouch = YES;
    [self addSubview:self.customCallout];
  }
...
}

initWithAnnotationこれらがあります:

   self.canShowCallout = NO;  // to appear the subview
   self.exclusiveTouch = YES; // ...
   self.enabled = YES;
   self.opaque = YES;
4

4 に答える 4

3

タッチ処理メソッド (touchesBegan: touchesEnded: など) のデフォルトの動作については、ドキュメントに次の注記があります。

このメソッドのデフォルトの実装は何もしません。ただし、UIResponder の直接の UIKit サブクラス、特に UIView は、メッセージをレスポンダー チェーンに転送します。

MKAnnotationView は UIVIew のサブクラスです。その結果、アノテーションがタッチされると、それはそのスーパー クラスとレスポンダー チェーンに渡されるため、最終的にマップ ビューがタッチを取得し、カバーされたアノテーションをアクティブにします。

解決するには、annotationView クラスにタッチ処理メソッドを実装し、タッチ イベントをレスポンダー チェーンに渡さないようにします。

于 2012-05-01T20:05:14.840 に答える
0

私は最近この問題を抱えていて、私が持っていなかった多くの時間を費やしていました。それを解決することは、実際には非常に簡単なことになりました。

MapView をサブクラス化し、そのサブクラス内で次のようにします。

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    debugPrint(gestureRecognizer)
    if gestureRecognizer is UITapGestureRecognizer {
        return true
    } else {
    return false
    }
}

その理由は、ズーム、パンなどのマップ インタラクションのすべての処理が内部で処理され、アクセスできないように見えるためです。ただし、問題を引き起こすジェスチャにはアクセスできますが、私の場合は、注釈の選択と選択解除を処理するタップ ジェスチャのみが必要です。

于 2018-05-01T12:29:28.367 に答える
0

次のリンクが非常に役立つと思います。

http://blog.asynchrony.com/2010/09/building-custom-map-annotation-callouts-part-2/

MKAnnotationView をタッチセンシティブにするにはどうすればよいですか?

最初のリンクでは (特に) 伝播を防ぐ方法について説明し、2 つ目のリンクではタッチを検出する方法について説明します。

于 2013-11-27T16:16:33.333 に答える