Добавить изображение за MKPinAnnotationView

Я пытаюсь добавить изображение за 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];

Проблема в том, что, хотя он находится за булавкой, как только карта перемещается, изображение выпадает из экрана.

Какие-либо предложения? Спасибо

3 ответа

Решение

Спасибо за вклад, вот в основном то, что я закончил делать без подклассов:

- (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,

Я подкласс MKAnnotatonView и преодолеть initWithAnnotation:resueIdentifier а также drawRect методы, чтобы добавить другое изображение позади "переднего" изображения.

Кажется, это то, что Apple, MKAnnotationView Ссылка на класс предлагает нам сделать.

Только то, что это сложно. Если вы подкласс MKAnnotationViewесть еще свойство изображения. Они что-то сделали правильно, чтобы это было связано с рисованием. Возможно, они переопределили 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. Что касается тени, я не уверен... Это может быть использование метода рисования OPEN GL для добавления тени или просто комбинирование теневого изображения.

Наконец, изображение поставляется с анимацией. Я предполагаю, что именно здесь запускается анимация. На данном этапе, однако, я не проверял.

Создайте новый составной вид аннотации, который сначала добавляет ваше изображение, а затем фактический 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  
Другие вопросы по тегам