32

これが私のコードです。iOS のデフォルトではなく、独自のカスタム吹き出しビューを追加したいと考えています。左吹き出しビューと右吹き出しビューしかないことはわかっていますが、独自の背景とラベルを使用してビュー ツールヒント タイプを追加する必要があります。

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        MKAnnotationView *userAnnotationView = nil;
        if ([annotation isKindOfClass:MKUserLocation.class])
        {
            userAnnotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"UserLocation"];
            if (userAnnotationView == nil)  {
            userAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"UserLocation"];
            }
            else
                userAnnotationView.annotation = annotation;

            userAnnotationView.enabled = YES;


            userAnnotationView.canShowCallout = YES;
            userAnnotationView.image = [UIImage imageNamed:@"map_pin.png"];
            UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0,0,141,108)];
            view.backgroundColor = [UIColor clearColor];
            UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"toltip.png"]];
            [view addSubview:imgView];
            userAnnotationView.leftCalloutAccessoryView = view;



            return userAnnotationView;
        }

}

参考画像

4

6 に答える 6

133

私は同じ問題を抱えていて、最終的に次のことをしました:

mapViewデリゲートコールバックを受け取ったとき

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

(カスタム CalloutView を表示したいときです)

パラメータ*(MKAnnotationView )view (ピン ビュー) として受け取ったビューを使用し、カスタム ビューをそのピン ビューに追加するだけです。

 [view addSubview:customView];

そのピン ビューの上にカスタム ビューが追加されるため、ピンの上に表示する場合は、カスタム ビュー センターのプロパティを次のように変更する必要があります。

CGRect customViewRect = customView.frame;
        CGRect rect = CGRectMake(-customViewRect.size.width/2, -customViewRect.size.height-7, customViewRect.size.width, customViewRect.size.height);
        customView.frame = rect;
[view addSubview:customView];

私の場合はこんな感じです

ここに画像の説明を入力

!注:

ただし、簡単に修正できる注意点が 1 つあります。mapViewのタッチ操作が異なるため、カスタム ビューはタッチ イベントを無視します。簡単な修正は次のとおりです。

1) MKAnnotationViewをサブクラス化します(またはMKPinAnnotationViewは、必要なものによって異なります)。

2) mapView デリゲートで

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

MKAnnotationView/MKPinAnnotationView の代わりにサブクラスを使用してください

3)サブクラスの .m ファイルで、次のように 2 つのメソッドをオーバーライドします。

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
    UIView* hitView = [super hitTest:point withEvent:event];
    if (hitView != nil)
    {
        [self.superview bringSubviewToFront:self];
    }
    return hitView;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
    CGRect rect = self.bounds;
    BOOL isInside = CGRectContainsPoint(rect, point);
    if(!isInside)
    {
        for (UIView *view in self.subviews)
        {
            isInside = CGRectContainsPoint(view.frame, point);
            if(isInside)
                break;
        }
    }
    return isInside;
}

すべて完了!

于 2013-10-16T13:37:19.410 に答える
10

カスタム コールアウトを表示するライブラリを作成しました。

DXCustomCallout-ObjC

コールアウトの任意のカスタム ビューを渡すことができます。UIControls のイベントもサポートしています。

カスタム吹き出し

于 2015-04-12T20:42:19.120 に答える
1

タップしたときに吹き出しが消える問題を回避するために、マップ ビュー用のカスタム吹き出しを作成しました。ここに私が取った手順の要点があります。

于 2013-11-16T02:51:11.030 に答える
1

CallOut ビューの最良の例を次に示します。

http://www.cocoacontrols.com/platforms/ios/controls/gikanimatedcallout

http://www.cocoacontrols.com/platforms/ios/controls/multirowcalloutannotationview

于 2013-03-06T07:33:42.467 に答える