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

Sat*_*yam 5 mapkit mkannotationview ios

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

在此输入图像描述

我创建了在"drawRect"中绘制颜色的TCircleView.

为了显示类似的注释,我创建了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;
}
Run Code Online (Sandbox Code Playgroud)

它不允许显示标注甚至不调用委托"didSelectAnnotationView:"
如何在地图上显示自定义视图作为注释?

小智 13

默认框架widthheightfor MKAnnotationView为0,0.
这很可能会阻止它对触摸做出响应.

通常,如果设置其image属性,frame则会自动为您设置.

由于您没有设置image和添加子视图,请尝试手动设置frame至少与其最大的子视图一样大.

例如:

imgView.frame = r;
circleView.frame = r;
annotationView.frame = r;  // <-- add this line
Run Code Online (Sandbox Code Playgroud)


Sat*_*yam 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];
}
Run Code Online (Sandbox Code Playgroud)