2012-05-01 18 views
9

Soy nuevo en mapkit en objective-c. Puedo agregar anotaciones personalizadas en mapview.cómo agregar una vista de llamada personalizada en la vista de mapa

que necesito para colocar vista de llamada personalizados, como a continuación la imagen

like this.

Pero no entendí cómo puedo diseñar una vista de llamada así.

Sé que necesito agregar texto destacado a la vista para el método de anotación.

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    static NSString *AnnotationViewID = @"annotationViewID"; 

    MKAnnotationView *annotationView = (MKAnnotationView *)[mapview dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID]; 

    if (annotationView == nil) 
    { 
     annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease]; 
    } 

    annotationView.image = [UIImage imageNamed:@"blue_without_pin.png"]; 
    annotationView.annotation = annotation; 


    return annotationView; 
} 
+0

http://shawnsbits.com/blog/2011/04/12/custom-map-pins-for-mapkit/..visit aquí .. – Nit

+0

gracias por su nit de reproducción, pero el enlace que ha publicado no está funcionando, no muestra resultados –

+0

http://shawnsbits.com/blog/2010/12/23/mapkit-overlays-session-1-overlay-map/ – hanumanDev

Respuesta

0

Básicamente lo que quiere hacer es añadir una nueva vista personalizada mediante la aplicación del siguiente método en la instancia MKMapViewDelegate:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view { 
    CGPoint annotationCenter = [mapView convertCoordinate:view.annotation.coordinate toPointToView:mapView]; 
    [self displayCustomCalloutForAnnotation:view.annotation center:annotationCenter]; 
} 
0
@interface CustomAnnotaionView : MKAnnotationView 




@property (strong, nonatomic) UIView *calloutView; 




-(void)setSelected:(BOOL)selected animated:(BOOL)animated; 




@end 




@implementation CustomAnnotaionView 




@synthesize calloutView = _calloutView; 




-(void)setSelected:(BOOL)selected animated:(BOOL)animated 





{ 

    [super setSelected:selected animated:animated]; 

    if(selected) 
    { 

     [self.calloutView setFrame:CGRectMake(30, 130, 250, 135)]; 
     [self.calloutView sizeToFit]; 
     self.calloutView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"popup.png"]]; 
     [self addSubview:self.calloutView]; 

    } 
    else 
    { 

     [self.calloutView removeFromSuperview]; 
    } 

} 

-(void)didAddSubview:(UIView *)subview 
{ 

    if([[[subview class]description]isEqualToString:@"UICalloutView"]) 
    { 

     [subview removeFromSuperview]; 

    } 
} 

Use this customAnnotationView class in MapView delegate method, 

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id 

<MKAnnotation>)annotation 

{ 



    if([annotation isKindOfClass:[MapAnnotation class]]) 
    { 
     CustomAnnotationView *annotationView = (CustomAnnotaionView*)[theMapView dequeueReusableAnnotationViewWithIdentifier:@"CustomAnnotationView"]; 
     if(!annotationView) 
     { 
     MapAnnotation *annotation = (MapAnnotation *)annotation; 

     annotationView = [[CustomAnnotaionView alloc]initWithAnnotation:annotation reuseIdentifier:@"CustomAnnotationView"]; 

      [annotationView setCanShowCallout:YES]; 
     } 
     else 
      annotationView.annotation = annotation; 

     return annotationView; 

    } 
    return nil; 

} 
-3

Debe implementar una llamada ve a sí mismo, y utilizar

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 

este delegado para hacer que la vista del letrero se muestre en el lugar correcto,

IOS no tiene ningún método para vista de llamada personalizados embargo

+1

¿Cómo se diferencia esto de la respuesta de @ pnollet? – Mark

0

Una solución para esto sería para detectar la exacta de coordenadas de la anotación seleccionada con respecto a la UIView padres y luego dibujar un UIView directamente en la parte superior de la MKMapView.

He aquí un fragmento que podría ayudar:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
{ 
    CGPoint pointInMap = [self.mapView convertCoordinate:buildingAnnotation.coordinate 
              toPointToView:self.view]; 

    // Hide the default callout generated by MKMapView 

    [mapView deselectAnnotation:view.annotation animated:NO]; 

    // Create a custom callout view and center the arrow on the pointInMap CGPoint 
} 
Cuestiones relacionadas