我有一个包含多个注释的MapView。我需要根据data.plist中的字符串值将不同的图像放到注释中
我的当前代码(只用于一个类别,一个图像):
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文件结构:
编辑
我的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;
}
发布于 2012-05-27 09:29:52
这就是你需要的吗?
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;
}
https://stackoverflow.com/questions/10772701
复制相似问题