Несколько массивов аннотаций, разные цвета выводов для каждого массива? - PullRequest
2 голосов
/ 16 августа 2011

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

- (MKAnnotationView *)mapView:(MKMapView *)sheratonmap viewForAnnotation:(id<MKAnnotation>)annotation {
    NSLog(@"Welcome to the Map View Annotation");

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

    static NSString* AnnotationIdentifier = @"Annotation Identifier";
    MKPinAnnotationView* pinview = [[[MKPinAnnotationView alloc]
                                     initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];

    pinview.animatesDrop=YES;
    pinview.canShowCallout=YES;
    pinview.pinColor=MKPinAnnotationColorPurple;

    UIButton* rightbutton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightbutton setTitle:annotation.title forState:UIControlStateNormal];
    [rightbutton addTarget:self action:@selector(showDetails) forControlEvents:UIControlEventTouchUpInside];
    pinview.rightCalloutAccessoryView = rightbutton;

    return pinview;
}

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

Спасибо!

Ответы [ 2 ]

6 голосов
/ 17 августа 2011

Определили ли вы собственный класс, который реализует протокол MKAnnotation, в который вы добавили какое-либо свойство, которое определяет, какая это аннотация?Или вы определили три отдельных класса (по одному для каждого типа аннотаций), которые реализуют MKAnnotation?

Предполагая, что вы определили один класс аннотаций, в котором у вас есть свойство int с именем say annotationType вваш класс аннотаций, то вы можете сделать это в viewForAnnotation:

int annType = ((YourAnnotationClass *)annotation).annotationType;
switch (annType)
{
    case 0 :   //Food
        pinview.pinColor = MKPinAnnotationColorRed;
    case 1 :   //Gas
        pinview.pinColor = MKPinAnnotationColorGreen;
    default :  //default or Shopping
        pinview.pinColor = MKPinAnnotationColorPurple;
}


Пара других вещей:

  • Вы должны использовать dequeueReusableAnnotationViewWithIdentifier: метод
  • Вместо использования addTarget: action и пользовательского метода для обработки нажатия кнопки вызова используйте метод делегата представления карты calloutAccessoryControlTapped.В этом методе делегата вы можете получить доступ к аннотации, используя view.annotation.
2 голосов
/ 16 августа 2011

Я бы предложил вам создать пользовательский MKAnnotation и иметь пользовательское свойство (наиболее вероятно, перечисление typedef), чтобы различать различные типы аннотаций.

typedef enum {
    Food,
    Gas,
    Shopping
} AnnotationType

После этого вы можете установить свои цвета условно if (annotation.annotationType == Food) { set pinColor }

Конечно, вы можете использовать оператор switch для AnnotationType, чтобы иметь более понятный код:

switch(annotation.annotationType) {
    case Food:
        do something;
        break;
    case Gas:
        do something;
        break;
    case Shopping:
        do something;
        break;
}

См. Следующий вопрос для получения дополнительной информации о добавлении большего количества цветов (если вы хотите расширить свое приложение позже):

MKPinAnnotationView: доступно более трех цветов?


Вот фрагмент кода из учебника , в котором показаны тяжелые модификации:

calloutMapAnnotationView.contentHeight = 78.0f;
UIImage *asynchronyLogo = [UIImage imageNamed:@"asynchrony-logo-small.png"];
UIImageView *asynchronyLogoView = [[[UIImageView alloc] initWithImage:asynchronyLogo] autorelease];
asynchronyLogoView.frame = CGRectMake(5, 2, asynchronyLogoView.frame.size.width, asynchronyLogoView.frame.size.height);
[calloutMapAnnotationView.contentView addSubview:asynchronyLogoView];

НТН

...