MKAnnotationView具有自定义视图和图像视图

时间:2014-02-15 18:33:23

标签: ios mapkit mkannotationview

在我的地图应用程序中,我想显示带有图像的彩色背景圆圈,而不是显示图钉。背景的颜色(下图中的绿色阴影)圆是动态的。它将如下图所示:

enter image description here

我创建了TCircleView,它在“drawRect”中绘制颜色

为了显示类似的注释,我创建了TCircleView和UIImageView的对象并将它们添加到MKAnnotationView对象。它看起来很好,并且如预期的那样可见。

但它不允许检测点击/触摸来显示呼叫。

我正在使用以下代码:

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

    if ([annotation isKindOfClass:[MKPointAnnotation class]]) {
        return nil;
    }

    static NSString *annotationIdentifier = @"StickerPin";

    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];

    if (!annotationView) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
        annotationView.canShowCallout = YES;
    }

    TCircleView* circleView = [[TCircleView alloc] init];
    circleView.green = [postObj[@"severity"] floatValue]; //dynamic value coming from server

    UIImageView* imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Piano"]];

    CGRect r = imgView.frame;
    r.size.height = r.size.width = 60;
    imgView.frame = r;
    circleView.frame = r;

    [annotationView addSubview:circleView];
    [annotationView addSubview:imgView];

    return annotationView;
}

它不允许显示callout或甚至不调用委托“didSelectAnnotationView:”
如何在地图上将自定义视图显示为注释?

3 个答案:

答案 0 :(得分:12)

width的默认框架heightMKAnnotationView为0,0 这很可能会阻止它对触摸做出响应。

通常情况下,如果您设置了image属性,系统会自动为您设置frame

由于您未设置image并添加子视图,请尝试手动将frame设置为至少与其最大子视图一样大。

例如:

imgView.frame = r;
circleView.frame = r;
annotationView.frame = r;  // <-- add this line

答案 1 :(得分:3)

我创建了一个注释视图的子类并实现了它。代码如下:

@interface TStickerAnnotationView : MKAnnotationView

@property(nonatomic) float stickerColor;

@end

@interface TStickerAnnotationView () {
    UIImageView *_imageView;
    TCircleView *_circleView;
}


@end

@implementation TStickerAnnotationView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // make sure the x and y of the CGRect are half it's
        // width and height, so the callout shows when user clicks
        // in the middle of the image
        CGRect  viewRect = CGRectMake(-30, -30, 60, 60);

        TCircleView* circleView = [[TCircleView alloc] initWithFrame:viewRect];
        _circleView = circleView;
        [self addSubview:circleView];

        UIImageView* imageView = [[UIImageView alloc] initWithFrame:viewRect];

        // keeps the image dimensions correct
        // so if you have a rectangle image, it will show up as a rectangle,
        // instead of being resized into a square
        imageView.contentMode = UIViewContentModeScaleAspectFit;

        _imageView = imageView;

        [self addSubview:imageView];



    }
    return self;
}

- (void)setImage:(UIImage *)image
{
    // when an image is set for the annotation view,
    // it actually adds the image to the image view
    _imageView.image = image;
}

- (void)stickerColor:(float)color {
    _circleView.green = color;
    [_circleView setNeedsDisplay];
}

答案 2 :(得分:1)

尝试查看此解决方案 - 我发现它相关 http://blog.jaanussiim.com/2014/01/28/floating-annotations.html