Я добавляю аннотации для местоположений, взятых из базы данных в MKMapView. Среди всех местоположений одно из местоположений является центральным местоположением. Значок, указывающий местоположение центра, будет иметь изображение, отличное от остальных меток местоположения. Кроме того, на булавке центрального местоположения должен отображаться заголовок, когда пользователь нажимает на нее. Вот код, который я пытаюсь:

  -(void)addPinWithTitle:(NSString *)lat longitude:(NSString*)longi
  {
  //get centerLocation
  NSString* centerLat=[GroupLocation getGroupLat];
  NSString* centerLon=[GroupLocation getGroupLon];

  MKPointAnnotation *mapPin = [[MKPointAnnotation alloc] init];
  double latitude =[lat doubleValue];
  double longitude =[longi doubleValue];
  CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(latitude, longitude);
  mapPin.coordinate = coordinate;

  if([lat isEqualToString:centerlat] && [longi isEqualToString:groupLon]){
  map.title=@"demoTitle";
  }
  [myMapView addAnnotation:mapPin];
  }

  - (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id <MKAnnotation>)annotation
  {
  if ([annotation isKindOfClass:[MKUserLocation class]])
  return nil;
  static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
  MKAnnotationView *annotationView = [myMapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
  if(annotationView)
  return annotationView;
  else
  {
  MKAnnotationView *annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation
  reuseIdentifier:AnnotationIdentifier];
  annotationView.canShowCallout = YES;

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

  UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
  // [rightButton addTarget:self action:@selector(writeSomething:) forControlEvents:UIControlEventTouchUpInside];
  [rightButton setTitle:annotation.title forState:UIControlStateNormal];
  annotationView.rightCalloutAccessoryView = rightButton;

  annotationView.draggable = YES;
  return annotationView;
  }
  return nil;
  }

Используя вышеуказанные методы, я показал все местоположения, извлеченные из базы данных в mkmapview, но теперь я не понимаю, как отображать другое изображение для определенного булавки местоположения и заголовка, когда пользователь нажимает этот центральный стержень. Кто-нибудь, подскажите, пожалуйста, как этого добиться. Заранее спасибо!

2
sarita 10 Янв 2017 в 20:16

1 ответ

Лучший ответ

Пример кода, необходимого для изменения широты, долготы, заголовка и подзаголовка.

ViewController.m

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import "V3AnnotationView.h"

@interface ViewController () {
    IBOutlet MKMapView *myMapView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSMutableArray *arrAnnotation = [[NSMutableArray alloc] init];

    V3AnnotationView *annotation = [[V3AnnotationView alloc] init];
    annotation.title = @"Ahmedabad";
    annotation.image = [UIImage imageNamed:@"icon1.png"];
    annotation.subtitle = @"City";
    annotation.coordinate = CLLocationCoordinate2DMake(23.0225, 72.5714);
    [arrAnnotation addObject:annotation];

    V3AnnotationView *annotationAirport = [[V3AnnotationView alloc] init];
    annotationAirport.title = @"Airport";
    annotationAirport.image = [UIImage imageNamed:@"airport.png"];
    annotationAirport.subtitle = @"Airport";
    annotationAirport.coordinate = CLLocationCoordinate2DMake(23.0734, 72.6266);
    [arrAnnotation addObject:annotationAirport];

    V3AnnotationView *annotationCarParking = [[V3AnnotationView alloc] init];
    annotationCarParking.title = @"Car";
    annotationCarParking.image = [UIImage imageNamed:@"carparking.png"];
    annotationCarParking.subtitle = @"Free parking";
    annotationCarParking.coordinate = CLLocationCoordinate2DMake(23.0225, 72.6714);
    [arrAnnotation addObject:annotationCarParking];

    V3AnnotationView *annotationWifi = [[V3AnnotationView alloc] init];
    annotationWifi.title = @"Wifi";
    annotationWifi.image = [UIImage imageNamed:@"wifi-512.png"];
    annotationWifi.subtitle = @"Free wifi";
    annotationWifi.coordinate = CLLocationCoordinate2DMake(23.0225, 72.7714);
    [arrAnnotation addObject:annotationWifi];

    [myMapView addAnnotations:arrAnnotation];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{

    // Handle any custom annotations.
    if ([annotation isKindOfClass:[V3AnnotationView class]])
    {
        V3AnnotationView *myAnnotation = (V3AnnotationView *)annotation;
        // Try to dequeue an existing pin view first.
        MKAnnotationView *pinView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
        if (!pinView)
        {
            // If an existing pin view was not available, create one.
            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomPinAnnotationView"];
            //pinView.animatesDrop = YES;
            pinView.canShowCallout = YES;
            pinView.calloutOffset = CGPointMake(0, 4);

        } else {
            pinView.annotation = annotation;
        }
        pinView.image = myAnnotation.image;
        return pinView;
    }
    return nil;
}

Вам нужно создать класс MKAnnotationView и скопировать приведенный ниже код в свой файл класса.

V3AnnotationView.h

#import <MapKit/MapKit.h>

@interface V3AnnotationView : MKAnnotationView
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
@property (nonatomic,copy) NSString *title;
@property (nonatomic,copy) NSString *subtitle;
@property (nonatomic,retain) UIImage *image;
@end

V3AnnotationView.m

#import "V3AnnotationView.h"

@implementation V3AnnotationView
@synthesize title,subtitle,coordinate,image;
1
Vivek 11 Янв 2017 в 16:16