2012-03-22 9 views
54

Desidero visualizzare un'immagine nel mio MKMapView invece del piccolo rock pin. Qualcuno può mettere qualche codice utile qui o dire come farlo?MKMapView: anziché il pin di annotazione, una vista personalizzata

Grazie!

EDIT

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation: 
(id <MKAnnotation>)annotation { 
MKPinAnnotationView *pinView = nil; 
if(annotation != mapView.userLocation) 
{ 
    static NSString *defaultPinID = @"com.invasivecode.pin"; 
    pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
    if (pinView == nil) pinView = [[MKPinAnnotationView alloc] 
             initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 

    pinView.pinColor = MKPinAnnotationColorGreen; 
    pinView.canShowCallout = YES; 
    pinView.animatesDrop = YES; 
    pinView.image = [UIImage imageNamed:@"pinks.jpg"]; //as suggested by Squatch 
} 
else { 
    [mapView.userLocation setTitle:@"I am here"]; 
} 
return pinView; 
} 

mi aspetto la mia immagine pinks.jpg di essere sulla mappa, appuntare la posizione invece di vista PIN predefinito (pin roccia a forma di). Ma ancora sto ottenendo l'immagine di default del pin.

+0

Sembra che tu desideri un'annotazione personalizzata. Controlla [questo tutorial] (http://shawnsbits.com/blog/2011/04/12/custom-map-pins-for-mapkit/). Googling per un tutorial di annotazione personalizzato ti aiuterà anche se non ti soddisfa. – Squatch

+0

Immagino che l'annotazione sia solo il _note_ che viene usato per dire informazioni sulla posizione _pinned_. Ma voglio personalizzare il pin, che cambia la sua immagine in un logo aziendale. – turtle

+0

Ti ho anche provato in modo _tutorial_, sembra che non abbia funzionato per me. Tutorial sta impostando la proprietà 'image' dell'oggetto' MKAnnotationView' su 'UIImage'. Ciò che ho provato, non cambia il _pinView_ nella mia immagine assegnata. – turtle

risposta

112

Quando si desidera utilizzare la propria immagine per una vista annotazione, è necessario creare uno MKAnnotationView anziché uno MKPinAnnotationView.

MKPinAnnotationView è una sottoclasse di MKAnnotationView quindi ha una proprietà image ma generalmente sovrascrive quella e disegna un'immagine pin (ecco a cosa serve).

Quindi modificare il codice per:

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) 
    { 
     static NSString *defaultPinID = @"com.invasivecode.pin"; 
     pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinView == nil) 
      pinView = [[MKAnnotationView alloc] 
             initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 

     //pinView.pinColor = MKPinAnnotationColorGreen; 
     pinView.canShowCallout = YES; 
     //pinView.animatesDrop = YES; 
     pinView.image = [UIImage imageNamed:@"pinks.jpg"]; //as suggested by Squatch 
    } 
    else { 
     [mapView.userLocation setTitle:@"I am here"]; 
    } 
    return pinView; 
} 


noti che animatesDrop è anche commentata dal momento che la proprietà esiste solo in MKPinAnnotationView.

Se si desidera eliminare le annotazioni immagine, è necessario eseguire l'animazione autonomamente. Puoi cercare Stack Overflow per "animatesdrop mkannotationview" e troverai diverse risposte. Ecco le prime due:

+0

Ciao Anna, voglio solo aggiungere un evento al clic di questa immagine pin. Come lo posso fare? – turtle

+0

Ciao Anna, hai qualche idea in mente per la seguente domanda http://stackoverflow.com/questions/27489898/image-annotation-on-ios – casillas

+0

@Anna per favore aiutami su questo http://stackoverflow.com/questions/35647839/show-dynamic-annotation-pin-in-mapview –

17

Ecco una risposta su Swift 3. E 'Ritiri dalla coda vista annotazione, se possibile, o ne crea uno nuovo, se non:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    // Don't want to show a custom image if the annotation is the user's location. 
    guard !(annotation is MKUserLocation) else { 
     return nil 
    } 

    // Better to make this class property 
    let annotationIdentifier = "AnnotationIdentifier" 

    var annotationView: MKAnnotationView? 
    if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier) { 
     annotationView = dequeuedAnnotationView 
     annotationView?.annotation = annotation 
    } 
    else { 
     annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) 
     annotationView?.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) 
    } 

    if let annotationView = annotationView { 
     // Configure your annotation view here 
     annotationView.canShowCallout = true 
     annotationView.image = UIImage(named: "yourImage") 
    } 

    return annotationView 
} 

Swift 2.2:

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
    // Don't want to show a custom image if the annotation is the user's location. 
    guard !annotation.isKindOfClass(MKUserLocation) else { 
     return nil 
    } 

    // Better to make this class property 
    let annotationIdentifier = "AnnotationIdentifier" 

    var annotationView: MKAnnotationView? 
    if let dequeuedAnnotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier) { 
     annotationView = dequeuedAnnotationView 
     annotationView?.annotation = annotation 
    } 
    else { 
     let av = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier) 
     av.rightCalloutAccessoryView = UIButton(type: .DetailDisclosure) 
     annotationView = av 
    } 

    if let annotationView = annotationView { 
     // Configure your annotation view here 
     annotationView.canShowCallout = true 
     annotationView.image = UIImage(named: "yourImage") 
    } 

    return annotationView 
} 
+0

Grazie. Perché chiami 'annotationView? .annotation = annotation'? Ho pensato che l'annotazione e la vista sono collegate automaticamente? – Andrej

+1

Non sono collegati automaticamente. Stai rimuovendo una vista annotazione riutilizzabile. Se è stato usato prima probabilmente ha un altro 'annotation' linkato. –

0

Sono d'accordo con con la risposta di Anna e mi piace mostrare come apparirà che in swift3. Questa risposta è con molte altre opzioni. Come ridimensionare l'immagine, ottenere un elenco di immagini da array e ect.

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
     if let annotation = annotation as? PetrolStation { 
      let identifier = "pinAnnotation" 
      var view: MKAnnotationView 
      if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) 
       as? MKPinAnnotationView { // 2 
       dequeuedView.annotation = annotation 
       view = dequeuedView 
      } else { 
       // 3 
       view = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier) 
       view.canShowCallout = true 

       //here We put a coordinates where we like to show bubble with text information up on the pin image 
       view.calloutOffset = CGPoint(x: -7, y: 7) 


       //Here this is a array of images 
       let pinImage = PetrolItem[activePlace].imgPetrol?[activePlace] 

       //Here we set the resize of the image 
       let size = CGSize(width: 30, height: 30) 
       UIGraphicsBeginImageContext(size) 
       pinImage?.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height)) 
       let resizeImage = UIGraphicsGetImageFromCurrentImageContext() 
       UIGraphicsEndImageContext() 
       view.image = resizeImage 

       //Here we like to put into bubble window a singe for detail Informations 
       view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) as UIView 
       //Here we make change of standard pin image with our image 
       view.image = resizeImage 
      } 

      return view 
     } 
     return nil 
    }