2009-10-02 5 views
3

J'essaie d'ajouter une image derrière un MKPinAnnotationView. On dirait qu'il devrait être assez facile à faire exactement ce ici:Ajouter une image derrière MKPinAnnotationView

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

Mais le problème que j'ai à faire cela est que la sous-vue de l'enfant à la broche se rendre sur le dessus de celui-ci ne SILLAGE.

J'ai aussi essayé:

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

Le problème avec ceci est que, alors qu'il est derrière la broche, dès que la carte est repositionné, l'image flotte hors de l'écran.

Des suggestions? Merci

Répondre

7

Merci pour l'entrée, voici en gros ce que je fini par faire sans sous-classement:

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

Je n'avais besoin que d'une seule broche, donc j'ai réglé reuseIdentifier sur nil.

+0

Comment pouvez-vous cacher la broche faire cela? –

+0

S'il n'y a pas MKPinAnnotationView, MKAnnotationView ne répondra pas aux touches. Comment résoudre le problème? – Satyam

3

Créer une nouvelle annotationview composite qui ajoute d'abord votre image et la MKAnnotationView réelle:

@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 
+0

Merci, je vais essayer. – Adolfo

4

J'ai sous-classé le MKAnnotatonView et remplacer les méthodes initWithAnnotation:resueIdentifier et drawRect pour ajouter une autre image derrière l'image "avant".

Il semble que c'est ce que suggère la référence de classe MKAnnotationView d'Apple.

Seulement que c'est difficile. Si vous sous-classez le MKAnnotationView, la propriété d'image existe toujours. Ils ont fait quelque chose à propos du correctement afin qu'il soit lié au dessin. Peut-être, ils ont outrepassé le drawRect pour dessiner l'image APRÈS que l'initialisation est faite.

De même, si vous ne définissez pas la propriété d'image, le cadre de votre annotationView personnalisé est défini sur la taille 0 et la méthode drawRect n'est pas appelée. Enfin, Apple affirme que les images doivent être entièrement remplies, c'est-à-dire qu'elles doivent utiliser une couleur transparente pour l'arrière-plan des dessins.

Ainsi: Dans votre sous-classe:

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

Après avoir fait la réponse, je me rends compte que vous vouliez réellement tirer derrière MKPinAnnotationView. Ma réponse n'est pas là, bien qu'elle montre où le dessin devrait peut-être être fait. Evidemment, MKPinAnnottions a sa propre méthode de dessin pour présenter un Pin et son ombre.

Je pense que vous pouvez probablement récupérer l'image Pin de la propriété self.image. Quant à l'ombre, je ne suis pas certain ... Il peut être en utilisant la méthode de dessin OPEN GL pour ajouter l'ombre, ou simplement en combinant une image d'ombre.

Enfin, l'image est accompagnée d'une animation. Je devine que c'est là que l'animation est exécutée. À ce stade, cependant, je n'ai pas testé.

Questions connexes