如何在地图视图中添加多个彩色标记。

3
我有一张地图,其中有三种类别的兴趣点。目前我已经让它们显示出来了,但它们都是相同的颜色。我该如何让它们显示不同的颜色,根据它们所属的类别呢?
我已经搜索了一下,但没有找到可以应用到我的代码中的东西。
这是我当前用于注释标记的代码:
-(void)pins:(NSString *)name lat:(NSString *)lat lon:(NSString *)lon poiID:(NSString *)poiID
{

    //cast string to float
    CGFloat Lat = (CGFloat)[lat floatValue];
    CGFloat Lon = (CGFloat)[lon floatValue];

    //Set coordinates of pin
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = Lat;
    coordinate.longitude = Lon;

    //Create Pin
    MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
    //set details
    [annotation setCoordinate:coordinate];
    [annotation setTitle:name];
    [annotation setAccessibilityLabel:poiID]; //set the label eq to the id so we know which poi page to go to


    // Add pin to map
    [self.showMapView addAnnotation:annotation];
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
    //create annotation
    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
    if (!pinView) {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"];
        pinView.pinColor = MKPinAnnotationColorRed;
        pinView.animatesDrop = FALSE;
        pinView.canShowCallout = YES;

        //details button
        UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        pinView.rightCalloutAccessoryView = rightButton;

    } else {
        pinView.annotation = annotation;
    }
    return pinView;
}

如果需要,这里是我代码的其余部分。

感谢任何帮助。

3个回答

5

这很简单,只需添加一个if语句来检查标题或副标题。当我使用地图时,我的注释类别有一个副标题,其中会说明地方是什么,例如酒店、机场等。我只需要添加一个if语句来检查,然后设置大头针的类型并设置大头针的颜色。

if([annotation.subtitle isEqualToString:@"Hotel"])
    {
        pinView.animatesDrop=YES;
        pinView.pinColor=MKPinAnnotationColorPurple;


    }else if([annotation.subtitle isEqualToString:@"Airport"])
    {
      pinView.animatesDrop=YES;
        pinView.pinColor=MKPinAnnotationColorRed;
    }

或者,如果你想要它成为一张图片,只需使用标签。
pinView.image = [UIImage imageNamed:@"airportMarker.png"];

编辑:更新代码

创建一个自定义注释类,如下所示:

@interface MyAnnotation : NSObject<MKAnnotation> 
{

    CLLocationCoordinate2D  coordinate;
    NSString*               title;
    NSString*               subtitle;
    NSInteger categoryID;
}
@property NSInteger categoryID;
@property (nonatomic, assign)   CLLocationCoordinate2D  coordinate;
@property (nonatomic, copy)     NSString*               title;
@property (nonatomic, copy)     NSString*               subtitle;

@end

当你将对象添加到屏幕中时,请为每个对象指定一个ID,即

CLLocationCoordinate2D hotelCoordinates1;
hotelCoordinates1.latitude = 35.38355;
hotelCoordinates1.longitude = 1.11004;
MyAnnotation* exampleHotel=[[MyAnnotation alloc] init];
exampleHotel.coordinate=hotelCoordinates1;
exampleHotel.title=@"Example Hotel";
exampleHotel.subtitle=@"Hotel";
exampleHotel.categoryID = 1;

然后在这个方法内部

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

只需这样做

if([(MyAnnotation*)annotation categoryID] == 1)
        {

        }

你需要确保将注释转换为你创建的类的名称。就是这样。希望有所帮助!


我认为通过注释名称来定义颜色并不是一个好的解决方案,因为这不是唯一的。 - edzio27
问题在于我不会知道任何名称或有副标题。我的所有内容都是动态的。因此,如果通过我的 Web 服务添加了另一类别,则这将无法工作 :/ - Will
在你的问题中,你说你有3个类别,所以我假设被添加的内容将适合这些3个类别。即使内容是动态的,你也应该有一些方法来识别正在添加的内容,可以通过给它一个副标题或给它一个唯一的ID来决定它应该是什么颜色。否则,你怎么可能将内容分成不同的颜色呢? - AdamM
你怎么给它一个ID呢?这样做可以,因为我有一个猫的ID。 - Will
我修改了我的答案,并附上了代码,展示给你如何做。希望能有所帮助! - AdamM
显示剩余2条评论

2
- (MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation {
   static NSString *AnnotationViewID = @"annotationViewID";

    MKAnnotationView *annotationView = (MKAnnotationView *)[MymapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil)
    {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
    }

    if (annotation == MymapView.userLocation)
        return nil;
    /////i give just an example with category 
    if(category == 1){
       annotationView.image = [UIImage imageNamed:@"Category1.png"];
    }
    else if(category == 2){
       annotationView.image = [UIImage imageNamed:@"Category2.png"];
    }

    annotationView.annotation = annotation;
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    annotationView.rightCalloutAccessoryView.tag = 101;

    annotationView.canShowCallout = YES;
    return annotationView;
}

它如何知道哪些引脚属于哪只猫? - Will
在你的-(void)pins:(NSString *)name lat:(NSString *)lat lon:(NSString *)lon poiID:(NSString *)poiID方法中,粘贴上述代码,并在使用类别和为pinView分配name.png之后使用name。 - Paras Joshi

1

您需要覆盖mkAnnotation类并定义特定字段,其中声明类别ID。在地图上创建注释时设置ID,在委托viewForAnnotation上检查注释ID,并检查当前ID的标记应使用哪种颜色。

您还可以查看此帖子以了解如何覆盖MKAnnotation类:MKAnnotation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接