MKMapView: вместо ПИН-кода аннотации, пользовательский вид
Я хочу, чтобы отобразить изображение в моем MKMapView
вместо rock pin. Может ли кто-нибудь, пожалуйста, поместить здесь полезный код или рассказать, как это сделать?
спасибо!
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;
}
Я ожидаю свой образ гвоздики.jpg чтобы быть на карте, закрепляя местоположение вместо pin-кода по умолчанию ( рок-штифт в форме). Но все же я получаю изображение по умолчанию pin-кода.
3 ответа:
если вы хотите использовать свое собственное изображение для вида аннотации, вы должны создать
MKAnnotationView
вместоMKPinAnnotationView
.
MKPinAnnotationView
является наследникомMKAnnotationView
вот этоimage
свойство, но оно обычно переопределяет это и рисует изображение pin (вот для чего оно предназначено).поэтому измените код на:
-(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; }
Обратите внимание, чтоanimatesDrop
также закомментирован, так как это свойство существует только вMKPinAnnotationView
.если вы все еще хотите, чтобы ваши изображения аннотации к падению, вы должны будете сделать анимацию самостоятельно. Вы можете найти переполнение стека для "animatesdrop mkannotationview", и вы найдете несколько ответов. Вот первые два:
вот ответ на Swift 3. Он деактивирует вид аннотации, если это возможно, или создает новый, если нет:
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.Этот ответ он имеет много других вариантов.Как изменить размер изображения, сделать список изображений из массива и 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 }