iphone objective-c ios mkmapview userlocation

iphone - ¿Cómo cambiar el punto azul de ubicación de usuario de MKMapView a una imagen de elección?



objective-c ios (5)

¿Es posible cambiar el punto azul que indica la ubicación del usuario en MKMapView a una imagen? Por ejemplo, un pequeño automóvil o cualquier imagen .png ?


¿Esto es para cambiar el punto azul de la ubicación actual?

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { let identifier = "User" var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) if annotationView == nil{ annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView.canShowCallout = true } else { annotationView.annotation = annotation } annotationView.image = UIImage(named: "image") return annotationView }


Aquí está la versión de Swift 2.0 en la que puede tener varios pines.

En este código CustomAnnotación es solo una subclase MKAnnotation. Básicamente, si la anotación no es del tipo de una de sus clases personalizadas, entonces es el pin de ubicación del usuario.

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { // This is false if its a user pin if(annotation.isKindOfClass(CustomAnnotation) == false) { let userPin = "userLocation" if let dequeuedView = _view.mapView().dequeueReusableAnnotationViewWithIdentifier(userPin) { return dequeuedView } else { let mkAnnotationView:MKAnnotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: userPin) mkAnnotationView.image = UIImage(named: C_GPS.ROUTE_WALK_ICON_NAME) let offset:CGPoint = CGPoint(x: 0, y: -mkAnnotationView.image!.size.height / 2) mkAnnotationView.centerOffset = offset return mkAnnotationView } } let annotation = annotation as? CustomAnnotation if(annotation == nil) { return nil } let endPointsIdentifier = "endPoint" if let dequeuedView = _view.mapView().dequeueReusableAnnotationViewWithIdentifier(endPointsIdentifier) { dequeuedView.image = annotation!.uiimage return dequeuedView } else { let mkAnnotationView:MKAnnotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: endPointsIdentifier) mkAnnotationView.image = annotation!.uiimage let offset:CGPoint = CGPoint(x: 0, y: -mkAnnotationView.image!.size.height / 2) mkAnnotationView.centerOffset = offset let gesture = UITapGestureRecognizer(target: self, action: "routeTouched:") mkAnnotationView.addGestureRecognizer(gesture) return mkAnnotationView } }


En el método viewForAnnotation: de MKMapViewDelegate probablemente tendrías el código así.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if (annotation == mapView.userLocation) return nil; ...

Devolvemos nil si la anotación es userLocation para que el mapView muestre la animación de punto azul y círculo. Para mostrar nuestra anotación personalizada para userLocation simplemente elimine la línea return nil; y haz tu personalización allí.

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { static NSString* AnnotationIdentifier = @"Annotation"; MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; if (!pinView) { MKPinAnnotationView *customPinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; if (annotation == mapView.userLocation){ customPinView.image = [UIImage imageNamed:@"myCarImage.png"]; } else{ customPinView.image = [UIImage imageNamed:@"mySomeOtherImage.png"]; } customPinView.animatesDrop = NO; customPinView.canShowCallout = YES; return customPinView; } else { pinView.annotation = annotation; } return pinView; }


Ok, aquí está la versión Swift:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { let identifier = "User" var annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) if annotationView == nil{ annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier) annotationView.canShowCallout = true } else { annotationView.annotation = annotation } annotationView.image = UIImage(named: "image") return annotationView }


Por favor, intente algo como esto. funciona para mí en Xcode 7 y swift 2.

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { // want to show a custom image if the annotation is the user''s location. guard !annotation.isKindOfClass(MKUserLocation) else { let annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: "userLocation") annotationView.image = UIImage(named: "icon_coordinates_self") return annotationView //return nil } // for other annotation except current location 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: "Annotation_map") } return annotationView }