7

マップ上に が含まれるカスタム アノテーション ビューがありますが、 をUIButton押しUIButtonても応答しません。注釈ビューでのユーザー操作には、主に 2 つの問題があります。

  1. ボタンやその他のコントロールが反応しません。
  2. 私の実装に従って、注釈がタッチをブロックするようにしたい- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event- つまり、YES を返す場合、タッチがMKMapView(注釈ビューの背後にある他の注釈を選択する可能性がある) に送信されないようにしたい。処理したいこの場合、自分自身に触れます。

userInteractionEnabledが に設定されていることを確認し、オーバーライドなどによってYESタッチがカスタム注釈ビュー (のサブクラス) に送信される方法を調査しました。 ) - そのため、カスタム注釈ビューを使用してユーザー インタラクションを手動で実装することさえ難しいようです。MKAnnotationViewtouchesBegantouchesEnded

オブジェクトとのより多くのユーザーインタラクションを可能にするための洞察を持っている人はいMKAnnotationViewますか?

4

4 に答える 4

5

私は同僚の助けを借りてこれを解決することができました。解決策はオーバーライドすること- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)eventです。私たちの仮定は、MKAnnotationView(注釈ビューが継承する必要がある) これをオーバーライドして、「間違った」ことを行うことです (おそらく、重複する注釈間で注釈の選択がブロックされないようにするためです)。したがって、正しいことを実行して適切なを返すには、それを再オーバーライドする必要がありますUIView。システムはイベントをそれに送信し、ユーザーはそれと対話できるようになります:)。これには、インタラクティブな注釈がその背後にある注釈の選択をブロックするという有益な (この場合) 副作用があります。

于 2011-08-26T12:57:47.083 に答える
0

jhabbottの答えを追加すると、これが私にとってうまくいきました。MKCustomAnnotationViewカスタム注釈を注釈として保持するカスタム注釈ビューがありますCustomPin。その「ピン」には、UIButtonタッチイベントを取得したいアクセサリボタンの交換品が含まれています。

私のhitTest方法は次のようになります。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    UIView *result = [super hitTest:point withEvent:event];
    //NSLog(@"ht: %f:%f %d %@", point.x, point.y, [[event touchesForView:self] count], result);

    if ([result isKindOfClass:[MKCustomAnnotationView class]])
    {
        MKCustomAnnotationView *av = (MKCustomAnnotationView *)result;
        CustomPin *p = av.annotation;
        UIButton *ab = p.accessoryButton;
        if (p.calloutActive && point.x >= ab.frame.origin.x)
            return ab;
    }

    return result;
}

ほとんどのcalloutActive場合、bool はおそらく必要ありません。

于 2013-04-02T12:15:27.387 に答える
0

TapGesture を AnnotationView サブビューに追加しようとしている人は、この末尾に答えがあります。

サブビューとしてUIButtonを使用したMKanotationView、ボタンが応答しない

私のために働いた:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(_button.frame, point)) {
        return _button;
    }
    return [super hitTest:point withEvent:event];
}
于 2016-02-25T10:35:30.490 に答える
0

hitTest:withEvent:オーバーライドするのではなく、代わりにオーバーライドpointInside:withEvent:して返すだけでよいことがわかりましたYES。公式には、タップしている場所がコントロール要素内にあることを確認するために、点と直角の交差チェックを行う必要があると思いますが、実際には、配置するだけでreturn YES完全にうまく機能しているように見えますが、タップして MKAnnotationView を閉じることができますそれから。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{   
    // for testing purposes
    BOOL result = [super pointInside:point withEvent:event];
    NSLog(@"pointInside:RESULT = %i", result);

    return YES;
}
于 2011-10-24T15:35:58.160 に答える