MapView Добавить несколько аннотаций с разными цветами

У меня есть два массива аннотаций. Из одного массива мне нужны все контакты зеленого цвета, а из другого - все контакты красного цвета. Я добавляю массив таким образом:

 fromSelectedTab=False;
[userMap addAnnotations:greenArray];
 fromSelectedTab=TRUE;
[userMap addAnnotations:redArray];

и с учетом аннотации я делаю следующее:

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

if([annotation isKindOfClass:[MKUserLocation class]])
    return nil;


 //    static NSString *identifier = @"myAnnotation";
//   // annotation=(MapObjects*)annotation;
//    MKPinAnnotationView * annotationView = (MKPinAnnotationView*)[userMap dequeueReusableAnnotationViewWithIdentifier:identifier];
 //    if(!annotationView){
MKPinAnnotationView * annotationView= [[MKPinAnnotationView alloc] init ];//WithAnnotation:annotation reuseIdentifier:nil];
    //annotationView.tintColor=[UIColor blackColor];
annotationView.annotation=annotation;
NSLog(@"flag%d",fromSelectedTab);
    if (fromSelectedTab==TRUE) {
        annotationView.pinColor = MKPinAnnotationColorRed;

    }
    else{
    annotationView.pinColor = MKPinAnnotationColorGreen;
     //   fromSelectedTab=TRUE;
    }
    annotationView.animatesDrop = NO;

    annotationView.canShowCallout = YES;

//fromSelectedTab=FALSE;


 //    else {
 //        annotationView.annotation = annotation;
 //    }

//annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
 }

Но так я получаю булавку того же цвета. Но хочу в двух цветах.


person prajapatijayesh    schedule 25.02.2014    source источник
comment
Используйте разные идентификаторы повторного использования для зеленого и красного цвета контактов. И используйте dequeueReusableAnnotationViewWithIdentifier: метод идентификатора, также используйте метод initWithAnnotation: reuseIdentifier: и укажите разные идентификаторы повторного использования для каждого цвета на основе аннотации.   -  person Sandeep    schedule 25.02.2014
comment
@ insane-36 можешь мне сказать как ???   -  person prajapatijayesh    schedule 25.02.2014
comment
Я покажу вам на примере ниже. Кстати, вам не нужно использовать два разных идентификатора повторного использования.   -  person Sandeep    schedule 25.02.2014
comment
@ insane-36 ... где пример?   -  person prajapatijayesh    schedule 25.02.2014
comment
Привет, тебе удалось решить проблему? Я показал вам пример ниже.   -  person Sandeep    schedule 25.02.2014
comment
да ... Я пробовал точно так же, но просто не знал, как преобразовать mapobject в аннотацию ...   -  person prajapatijayesh    schedule 25.02.2014


Ответы (2)


Пользовательский класс, который также реализует протокол MKAnnotation, также дает возможность использовать нашу собственную переменную. Я создал свойство под названием redColor, которое вы можете назвать как хотите.

MyAnnotation.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface MyAnnotation : NSObject<MKAnnotation>

@property (nonatomic, assign, getter = isRedColor) BOOL redColor;
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString*)title;


@end

MyAnnotation.m

#import "MyAnnotation.h"

@implementation MyAnnotation

- (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate title:(NSString*)title{
    if(self = [super init]){
    _coordinate = coordinate;
    _title = title;
  }
  return self;
}

@end

ViewController.h

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

@interface ViewController ()<MKMapViewDelegate>
@property (weak, nonatomic) IBOutlet MKMapView *mapView;


@end

@implementation ViewController

- (void)viewDidLoad
{
  [super viewDidLoad];

  NSMutableArray *allAnnotations = [NSMutableArray array];
  CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake( 50.8500,4.3500);
  MyAnnotation *annotation = [[MyAnnotation alloc] initWithCoordinate:coordinate title:@"Brussels"];
  annotation.redColor = YES;

  [allAnnotations addObject:annotation];


  coordinate = CLLocationCoordinate2DMake(28.61389, 77.20889);
  annotation = [[MyAnnotation alloc] initWithCoordinate:coordinate title:@"New Delhi"];
  annotation.redColor = NO;

  [allAnnotations addObject:annotation];


  coordinate = CLLocationCoordinate2DMake(60.1708, 24.9375);
  annotation = [[MyAnnotation alloc] initWithCoordinate:coordinate title:@"Helsinki"];
  annotation.redColor = YES;

  [allAnnotations addObject:annotation];

  coordinate = CLLocationCoordinate2DMake(51.5072, 0.1275);
  annotation = [[MyAnnotation alloc] initWithCoordinate:coordinate title:@"London"];
  annotation.redColor = NO;

  [allAnnotations addObject:annotation];

  coordinate = CLLocationCoordinate2DMake(39.9139, 116.3917);
  annotation = [[MyAnnotation alloc] initWithCoordinate:coordinate title:@"Beijing"];
  annotation.redColor =YES;
  [allAnnotations addObject:annotation];

  [self.mapView showAnnotations:allAnnotations animated:YES];

  [self.mapView addAnnotations:allAnnotations];

}
 #pragma mark - MKMapViewDelegate

- (MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
  MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"PinView"];
  if(!pinView){
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"PinView"];
        pinView.canShowCallout = YES;
  }
  MyAnnotation *myannotation = (MyAnnotation*)annotation;
  if(myannotation.redColor)
    pinView.pinColor = MKPinAnnotationColorRed;
  else
    pinView.pinColor = MKPinAnnotationColorGreen;
  return pinView;
}
@end
person Sandeep    schedule 25.02.2014
comment
здесь я взял строку вместо переменной bool - person prajapatijayesh; 25.02.2014

Проблема здесь в том, что метод addAnnotations, вероятно, не синхронный. Это означает, что метод делегата viewForAnnotation не добавляется сразу после вызова addAnnotations.

Правильный способ решить эту проблему - создать класс для аннотаций и добавить к нему свойство цвета. Из вашего кода мы не видим класс аннотации.

Следуйте приведенной ниже процедуре, чтобы устранить проблему.

  1. Создайте класс, реализующий протокол MKAnnotation.
  2. Добавьте свойство BOOL с именем fromSelectedTab (или что-нибудь еще в этом отношении).
  3. Создайте массив этих классов и установите правильное свойство цвета.
  4. Добавьте аннотации к виду карты.
  5. В методе viewForAnnotation приведите класс аннотации и получите свойство цвета.
  6. Установите свойство MKPinAnnotationView pinColor на основе свойства класса аннотации.

Теперь булавки должны быть правильного цвета.

Также не забывайте использовать метод dequeueReusableAnnotationViewWithIdentifier: при размещении новых MKAnnotationView.

person Legoless    schedule 25.02.2014
comment
Я уже создал этот класс, у которого есть три свойства, заголовок, подзаголовок и координата. Я думал так же, но я не могу получить доступ к annotation.title или annotation.subtitle или annotation.coordinate в методе viewforannotation - person prajapatijayesh; 25.02.2014
comment
Вы добавили аннотацию id ‹MKAnnotation› в свой класс? - person Legoless; 25.02.2014
comment
Yupp .... готово .... Я подумал о том же решении, но теперь не могу выполнить кастинг. Я ищу, как кастовать, и да, с моей функциональностью - person prajapatijayesh; 25.02.2014