3

我正在尝试在 MKPinAnnotationView 后面添加图像。似乎在这里这样做应该很容易:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
 for (MKAnnotationView *aView in views)
  [[aView superview] addSubview:imageView];
}

但是我这样做的问题是,pin 的子子视图将呈现在它的顶部而不是在它的后面。

我也试过:

 for (MKAnnotationView *aView in views)
  [[aView superview] insertSubview:imageView atIndex:1];

这样做的问题是,虽然它位于图钉后面,但一旦重新定位地图,图像就会浮出屏幕。

有什么建议么?谢谢

4

3 回答 3

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;
}

我只需要一个别针,所以我设置reuseIdentifiernil.

于 2009-10-04T02:44:57.827 回答
4

我已经MKAnnotatonView继承并覆盖了initWithAnnotation:resueIdentifieranddrawRect方法以在“正面”图像后面添加另一个图像。

似乎这就是 Apple 的MKAnnotationView类参考建议我们做的事情。

只是它很棘手。如果您将 子类化MKAnnotationView,则仍然存在 image 属性。他们已经做了一些适当的事情,以便与绘图联系起来。也许,他们已经覆盖了 drawRect 以在初始化完成后绘制图像。

此外,如果您不设置图像属性,则自定义的框架将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绘图方法添加阴影,或者只是组合一个阴影图像。

最后,图像带有动画。我猜那是动画运行的地方。不过,在这个阶段,我还没有测试过。

于 2010-02-09T01:20:08.377 回答
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  
于 2009-10-02T08:42:38.583 回答