Bild hinzufügen hinter MKPinAnnotationView
-
19-09-2019 - |
Frage
Ich versuche, ein Bild hinter einem MKPinAnnotationView hinzuzufügen. Scheint, wie es recht einfach sein sollte, gerade dies zu tun hier:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *aView in views)
[[aView superview] addSubview:imageView];
}
Aber das Problem das ich habe, das zu tun, ist, dass das Kind subview mit dem Stift auf es nicht dahinter machen wird.
Ich habe auch versucht:
for (MKAnnotationView *aView in views)
[[aView superview] insertSubview:imageView atIndex:1];
Das Problem dabei ist, dass, während es hinter dem Stift ist, sobald die Karte neu positioniert wird, schwimmt weg das Bild auf den Bildschirm.
Irgendwelche Vorschläge? Dank
Lösung
Danke für den Input, hier ist im Grunde, was ich ohne Subclassing tun endete:
- (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;
}
Ich brauchte nur einen Stift, so dass ich reuseIdentifier
nil
.
Andere Tipps
Ich habe die MKAnnotatonView
und überwog die initWithAnnotation:resueIdentifier
und drawRect
Methoden subclassed ein anderes Bild hinter dem „Front“ Bild hinzuzufügen.
Es scheint, dass das ist, was Apples MKAnnotationView
Klassenreferenz uns darauf hindeutet, zu tun.
Nur, dass es schwierig. Wenn Sie die MKAnnotationView
sind Subklassen, gibt es noch die Bildeigenschaft vorhanden ist. Sie haben etwas über die richtig gemacht, so dass es mit Zeichnung verknüpft ist. Vielleicht haben sie die drawRect außer Kraft gesetzt, das Bild zu zeichnen, nachdem die Initialisierung durchgeführt wird.
Auch wenn Sie die Bildeigenschaft nicht festgelegt, wird der Rahmen der benutzerdefinierten annotationView
Größe 0 gesetzt und die drawRect
Methode nicht aufgerufen wird.
Schließlich sagt Apple, dass die Bilder sollten vollständig gefüllt werden, das heißt verwendet eine transparente Farbe für den Hintergrund der Zeichnungen.
So: In der Unterklasse:
- (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);
}
Nachdem ich die Antwort gemacht, merke ich, dass Sie tatsächlich hinter MKPinAnnotationView
ziehen wollten. Meine Antwort ist nicht, dass, obwohl es zeigt, wo die Zeichnung vielleicht getan werden soll. Offensichtlich MKPinAnnottions
hat seine eigenen Ziehverfahren einen Pin und seinen Schatten zu präsentieren.
Ich denke, dass wahrscheinlich können Sie die Pin Bild aus der self.image Eigenschaft abrufen. In Bezug auf die Schatten, bin ich nicht sicher ... Es kann OPEN GL Ziehverfahren wird mit dem Schatten hinzuzufügen, oder einfach nur ein Schattenbild kombiniert werden.
Schließlich kommt das Bild mit Animation. Ich vermute, dass das ist, wo die Animation ausgeführt wird. In dieser Phase haben aber ich nicht getestet.
Erstellen Sie eine neue Verbund AnnotationView, die zuerst Ihr Bild addiert und dann die tatsächliche 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