我正在尝试在MKPinAnnotationView后面添加图像。看起来这样做应该很容易:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *aView in views)
[[aView superview] addSubview:imageView];
}
但我遇到的问题是,针脚的子视图将呈现在它之上而不是它背后。
我也尝试过:
for (MKAnnotationView *aView in views)
[[aView superview] insertSubview:imageView atIndex:1];
问题在于,当它在引脚后面时,一旦地图重新定位,图像就会浮出屏幕。
有什么建议吗?感谢
答案 0 :(得分:7)
感谢您的输入,这里基本上是我没有子类化的结果:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {
MKAnnotationView *annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
UIImage *image = [UIImage imageNamed:@"image.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[annView addSubview:imageView];
[imageView release];
MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
[annView addSubview:pinView];
[pinView release];
return annView;
}
我只需要一个引脚,因此我将reuseIdentifier
设置为nil
。
答案 1 :(得分:4)
我已将MKAnnotatonView
子类化,并覆盖了initWithAnnotation:resueIdentifier
和drawRect
方法,以便在“前”图片后面添加另一张图片。
这似乎是Apple的MKAnnotationView
类引用建议我们做的。
只是它很棘手。如果您是MKAnnotationView
的子类,则仍然存在image属性。他们已经做了一些正确的事情,以便与绘画联系起来。也许,他们已经覆盖了drawRect,以便在初始化完成后绘制图像。
此外,如果您未设置image属性,则自定义annotationView
的框架将设置为0,并且不会调用drawRect
方法。
最后,Apple表示应该完全填充图像,即使用透明颜色作为图纸的背景。
所以:在你的子类中:
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)identifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
if (self)
{
UIButton *rightButton = [UIButton buttonWithType: UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(myShowAnnotationAddress:)
forControlEvents:UIControlEventTouchUpInside];
self.rightCalloutAccessoryView = rightButton;
self.canShowCallout = YES;
self.multipleTouchEnabled = NO;
self.frame = CGRectMake(0, 0, 65, 100);
self.backgroundColor = [UIColor clearColor];
return self;
}
return nil;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGPoint drawPoint = CGPointMake(0.0f, 0.0f);
UIImage *shadowImage = [UIImage imageNamed:@"shadow_image.png"];
[shadowImage drawAtPoint:drawPoint];
UIImage *frontImage = [UIImage imageNamed:@"front_image.png"];
[frontImage drawAtPoint:drawPoint];
CGContextRestoreGState(context);
}
在我得到答案之后,我意识到你实际上想要在MKPinAnnotationView
后面画画。我的答案不是这样,尽管它显示了绘图或许应该完成的地方。显然MKPinAnnottions
有自己的绘图方法来呈现Pin及其阴影。
我认为你可以从self.image属性中检索Pin图像。至于阴影,我不确定......它可能是使用OPEN GL绘图方法来添加阴影,或者只是组合阴影图像。
最后,图像附带动画。我猜这就是动画运行的地方。但是,在这个阶段,我还没有测试过。
答案 2 :(得分:3)
创建一个新的复合注释视图,首先添加您的图像,然后添加实际的MKAnnotationView:
@implementation MyCustomAnnotationView
- (void) viewDidLoad
{
// First add the image to our subviews
UIImageView *view = [[UIImageView alloc] initWithImage: myImageProperty];
[self.view addSubview: view];
[view release];
// Then add the MKAnnotationView on top of it
MKAnnotationView *annotation = [[MKAnnotationView alloc] init];
[self.view addSubview: annotation];
[annotation release];
}
@end