Aggiungi immagine dietro MKPinAnnotationView
-
19-09-2019 - |
Domanda
Sto cercando di aggiungere un'immagine dietro un MKPinAnnotationView. Sembra che dovrebbe essere piuttosto facile da fare proprio questo qui:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *aView in views)
[[aView superview] addSubview:imageView];
}
Ma il problema che sto avendo a farlo è che la visualizzazione secondaria bambino al pin renderà su di esso non è dietro di esso.
Ho anche provato:
for (MKAnnotationView *aView in views)
[[aView superview] insertSubview:imageView atIndex:1];
Il problema di questo è che, mentre è dietro il perno, non appena la mappa viene riposizionato, l'immagine galleggia fuori dallo schermo.
Qualche suggerimento? Grazie
Soluzione
Grazie per l'ingresso, ecco fondamentalmente ciò che ho finito per fare, senza la creazione di sottoclassi:
- (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;
}
necessario un unico perno, così imposto reuseIdentifier
a nil
.
Altri suggerimenti
Ho sottoclasse il MKAnnotatonView
e sovrascritto metodi initWithAnnotation:resueIdentifier
e drawRect
per aggiungere un'altra immagine dietro l'immagine "fronte".
Sembra che questo è ciò che ci sta suggerendo di riferimento di classe MKAnnotationView
di Apple di fare.
Solo che è difficile. Se si sottoclasse il MKAnnotationView
, c'è ancora la proprietà immagine esistente. Hanno fatto qualcosa per il correttamente in modo che esso è collegato con il disegno. Forse, hanno ignorato il drawRect per disegnare l'immagine dopo l'inizializzazione è fatta.
Inoltre, se non si imposta la proprietà delle immagini, la struttura del vostro annotationView
personalizzato è impostato su 0 dimensioni, e il metodo drawRect
non viene chiamato.
Infine, Apple dice che le immagini dovrebbero essere totalmente riempiti, vale a dire usa un colore trasparente per lo sfondo dei disegni.
Quindi: nella sottoclasse:
- (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);
}
Dopo che ho fatto la risposta, mi rendo conto che in realtà voleva disegnare dietro MKPinAnnotationView
. La mia risposta non è così, anche se mostra dove il disegno, forse dovrebbe essere fatto. Ovviamente MKPinAnnottions
ha il proprio metodo di disegno per presentare una Pin e la sua ombra.
Credo che, probabilmente, è possibile recuperare l'immagine Pin dalla proprietà self.image. Per quanto riguarda l'ombra, io non sono certo ... Si può utilizzare il metodo di disegno GL OPEN per aggiungere l'ombra, o semplicemente combinando immagine un'ombra.
Infine, l'immagine viene fornito con animazione. Sto indovinando che è qui che viene eseguito l'animazione. In questa fase, però, non ho ancora testato.
Crea un nuovo annotationview composito che aggiunge prima l'immagine e poi la MKAnnotationView attuale:
@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