MKMapView,当我触摸pinview时如何添加自定义视图?

时间:2011-04-17 08:47:12

标签: mkmapview

MKMapView默认情况下,点击图钉视图会出现一个小黑框的标题和副标题,但现在我想在视图上显示更多数据。我想点击图钉视图时显示客户视图。

有没有人做过类似的事情?我尝试了以下方法,但它们不起作用:

  1. 使用代理访问click事件mapView:didSelectAnnotationView,但不止代理只支持ios4.x
  2. 使用tapgesture捕获事件,仅在ios3.2之后支持
  3. 尝试继承MKMapView,发现无法获得触摸事件。

1 个答案:

答案 0 :(得分:-1)

也可能是MKMapView with custom MKAnnotation的副本 以下是创建自定义标注的方法 http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/

想知道如何解决 “3.尝试继承MKMapView,发现无法获得触摸事件。”早于iOS4.x设备,这里是如何

  • 子类MKAnnotationView,如下所示(.h和.m文件)

.h文件

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>

    @interface ClickableMapAnnotationView : MKAnnotationView {

        SEL pinClicked;
        id delegate;
    }

    @property(nonatomic, assign) SEL pinClicked;
    @property(nonatomic, assign) id delegate;

@end

.m文件

#import "ClickableMapAnnotationView.h"

@implementation ClickableMapAnnotationView

@synthesize pinClicked;
@synthesize delegate;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    if ( delegate != nil && [delegate respondsToSelector:pinClicked] )
        [delegate performSelector:pinClicked withObject:self.annotation];

    [super touchesBegan:touches withEvent:event];
}

@end
  • 然后在用于mapView的UIViewController中,您需要设置ClickableAnnotation委托和选择器

- (MKAnnotationView *)mapView:(MKMapView )mapViewParam viewForAnnotation:(id)annotation {     static NSString PIN_RECYCLE_ID = @“pin”;

if ( annotation == self.mapView.userLocation) // this is my location pin, skip
    return nil;

ClickableMapAnnotationView* pin = (ClickableMapAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier: PIN_RECYCLE_ID];
if ( pin == nil ) {
    pin = [[[ClickableMapAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: PIN_RECYCLE_ID] autorelease];

    // wire, pin clicked functionality
    pin.delegate = self;
    pin.pinClicked = @selector(annotationViewClicked:);

...

-(void) annotationViewClicked:(id) sender {

   // map pin has been clicked

}