Добавить изображение за 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];

Проблема заключается в том, что, пока он НАХОДИТСЯ за булавкой, как только карта перемещается, изображение исчезает с экрана.

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


person Adolfo    schedule 02.10.2009    source источник


Ответы (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.

person Adolfo    schedule 04.10.2009
comment
Как можно при этом спрятать булавку? - person ingh.am; 12.02.2010
comment
Если MKPinAnnotationView нет, MKAnnotationView не будет реагировать на прикосновения. Как решить проблему? - person Satyam; 15.02.2014

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

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

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

Я думаю, что, вероятно, вы можете получить изображение булавки из свойства self.image. Что касается тени, я не уверен ... Это может быть метод рисования OPEN GL для добавления тени или просто комбинирование теневого изображения.

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

person Yoichi    schedule 09.02.2010

Создайте новое составное представление аннотации, которое сначала добавит ваше изображение, а затем фактический 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  
person NSSec    schedule 02.10.2009