MKMapView:而不是注释引脚,一个自定义视图

我想在我的MKMapView显示一个图像,而不是一个小小的MKMapView 。 有人可以在这里提供一些有用的代码,或告诉方式如何做到这一点?

谢谢!

编辑

 -(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; } 

我期待我的图像pinks.jpg在地图上,钉住的位置,而不是默认的销钉视图( 岩钉形状 )。 但是我仍然得到了引脚的默认图像。

当你想使用你自己的图像作为注解视图时,你应该创build一个MKAnnotationView而不是MKPinAnnotationView

MKPinAnnotationViewMKPinAnnotationView的子类,所以它有一个image属性,但它通常覆盖并绘制一个图像(这就是它的目的)。

因此,将代码更改为:

 -(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; } 

注意MKPinAnnotationView也被注释掉了,因为该属性只存在于MKPinAnnotationView

如果您仍然希望图像注释掉落,则必须自己animation。 你可以search堆栈溢出“animatesdrop mkannotationview”,你会发现几个答案。 这里是前两个:

  • 是否有可能在MKAnnotationView而不是MKPinAnnotationView中调用animatesDrop?
  • 我怎样才能使用MKAnnotationView创build一个自定义的“pin-drop”animation?

这是Swift 3的答案。 如果可能的话,它会使注解视图出列,否则创build一个新视图:

 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 } 

我同意安娜的回答,我喜欢展示如何在swift3中看这个答案。它有很多其他的select。像调整图像大小,从数组和图像中获取图像列表。

 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 }