0

複数の注釈を持つ MapView があります。data.plist の文字列値に応じて、注釈に異なる画像を配置する必要があります

私の現在のコード(1つのカテゴリ、1つの画像でのみ機能します):

NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

    NSArray *anns = [dict objectForKey:@"Category1"];
    pinView.image = [UIImage imageNamed:[[anns objectAtIndex:0] objectForKey:@"Icon"]];

    pinView.canShowCallout=YES;

私のplistファイルの構造:

plist

編集

マイ MapViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];


    NSMutableArray *annotations = [[NSMutableArray alloc]init];


    NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];


    NSArray *anns = [dict objectForKey:@"Category1"];

    NSLog(@" MapView is %@",mapView);
    NSLog(@"anns is: %@", anns);



    for(int i = 0; i < [anns count]; i++) {


        NSString *coordinates = [[anns objectAtIndex:i] objectForKey:@"Coordinates"];

        double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
        double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];

        MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = realLatitude;
        theCoordinate.longitude = realLongitude;


        //calculate distance
        CLLocationCoordinate2D annocoord = myAnnotation.coordinate;
        CLLocationCoordinate2D usercoord = self.mapView.userLocation.coordinate;

        NSLog(@"ANNO  = %f, %f", annocoord.latitude, annocoord.longitude);
        NSLog(@"USER = %f, %f", usercoord.latitude, usercoord.longitude);

        CLLocation *loc = [[CLLocation alloc] initWithLatitude:myAnnotation.coordinate.latitude longitude:myAnnotation.coordinate.longitude];
        CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.mapView.userLocation.coordinate.latitude longitude:self.mapView.userLocation.coordinate.longitude];

        NSLog(@"LOC  = %f, %f", loc.coordinate.latitude,  loc.coordinate.longitude);
        NSLog(@"LOC2 = %f, %f", loc2.coordinate.latitude, loc2.coordinate.longitude);

        CLLocationDistance dist = [loc distanceFromLocation:loc2];

        NSLog(@"DIST: %f", dist); 

        myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
        myAnnotation.title = [[anns objectAtIndex:i] objectForKey:@"Name"];
        myAnnotation.subtitle = [NSString stringWithFormat:@"%.f", dist];


        [mapView addAnnotation:myAnnotation];
        [annotations addObject:myAnnotation];
    }


    NSArray *alko = [dict objectForKey:@"Category2"];

    NSLog(@" MapView is %@",mapView);
    NSLog(@"alko is: %@", alko);


    for(int i = 0; i < [alko count]; i++) {


        NSString *coordinates = [[alko objectAtIndex:i] objectForKey:@"Coordinates"];

        double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
        double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];

        MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = realLatitude;
        theCoordinate.longitude = realLongitude;

        myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
        myAnnotation.title = [[alko objectAtIndex:i] objectForKey:@"Name"];
        myAnnotation.subtitle = [[alko objectAtIndex:i] objectForKey:@"Address"];


        [mapView addAnnotation:myAnnotation];
        [annotations addObject:myAnnotation];
    }





    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];

}

注釈

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


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


    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
                                    initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];


    NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

    NSArray *anns = [dict objectForKey:@"Category1"];
    pinView.image = [UIImage imageNamed:[[anns objectAtIndex:0] objectForKey:@"Icon"]];

    pinView.canShowCallout=YES;


    return pinView;
}
4

1 に答える 1

0

これはあなたが必要なものですか?

NSString *theCategory;

// set theCategory to what you need.
theCategory = @"Category1"

NSArray *anns = [dict objectForKey:theCategory];

編集1

まず、アノテーションクラスを次のように設定することをお勧めします。

MyAnnotation.h

#import <MapKit/MapKit.h>

@interface MyAnnotation : NSManagedObject <MKAnnotation>{

CLLocationCoordinate2D coordinate;
UIImage *imageForMyAnnotation;
}

@property (nonatomic,readwrite) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) UIImage *imageForMyAnnotation;

MyAnnotation.m

#import "MyAnnotation.h"

@implementation MyAnnotation

- (CLLocationCoordinate2D)coordinate
{
//here you can set the coordinate of your annotation
return coordinate;
}

- (UIImage *)imageForMyAnnotation{
//set the image here, i think it is depend on the coordinate right? You can put some code here to chose the category that corresponding to the coordinate
return image;
}

// optional
- (NSString *)title
{
return title;
}
- (NSString *)subtitle
{
return subtitle;
}

次に、mapViewで、次のように注釈を追加できます。

MapView.m

[self.mapView addAnnotations:myAnnotationArray];

また

[self.mapView addAnnotation:myAnnotation];

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

UIImageView *annotationImageView = [[UIImageView alloc] initWithImage: myAnnotation.imageForMyAnnotatioin]; 

customPinView.leftCalloutAccessoryView = annotationImageView;

}
于 2012-05-27T09:29:52.973 に答える