在我的地图应用程序中,我想显示带有图像的彩色背景圆圈,而不是显示图钉。背景的颜色(下图中的绿色阴影)圆是动态的。它将如下图所示:
我创建了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:”
如何在地图上将自定义视图显示为注释?
答案 0 :(得分:12)
width
的默认框架height
和MKAnnotationView
为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