Добавить изображение за MKPinAnnotationView - PullRequest
3 голосов
/ 02 октября 2009

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

7 голосов
/ 04 октября 2009

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

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

4 голосов
/ 09 февраля 2010

Я разделил на подклассы 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 имеет свой собственный метод рисования для представления булавки и ее тени.

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

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

3 голосов
/ 02 октября 2009

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