mapview 标注多个地点

Very new to xcode and somewhat confused. I was able to use a custom image for annotation - works fine. Problem is that I want to do is have a different images for each of the annotations. What should I add/change to the code below? Thanks in advance and remember, I'm a newbee!


#import "MapViewController.h"

@interface AddressAnnotation : NSObject<MKAnnotation> { CLLocationCoordinate2D coordinate; NSString *mTitle; NSString *mSubTitle; UIImage *image; } @property (nonatomic, retain) UIImage *image; @end @implementation AddressAnnotation @synthesize coordinate; @synthesize image; - (NSString *)subtitle{ return mSubTitle; } - (NSString *)title{ return mTitle; } -(id)initWithCoordinate:(CLLocationCoordinate2D) c Title: (NSString *)title SubTitle: (NSString *) subTitle{ coordinate=c; mTitle = [title retain]; mSubTitle = [subTitle retain]; NSLog(@"%f,%f",c.latitude,c.longitude); return self; } -(void) dealloc{ [super dealloc]; [mTitle release]; [mSubTitle release]; } @end @implementation MapViewController // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. } return self; } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; //------ To Set center of the map ------ CLLocationCoordinate2D center; center.latitude = 37.83792; center.longitude = -122.247865; MKCoordinateRegion region; MKCoordinateSpan span; span.latitudeDelta = 0.05; span.longitudeDelta = 0.05; region.center = center; region.span = span; [mapView setRegion:region animated:YES]; //------ To Add a point of interest ------ CLLocationCoordinate2D c1; // Point one c1.latitude = 37.8393624; c1.longitude = -122.2436549; AddressAnnotation* ad1 = [[AddressAnnotation alloc] initWithCoordinate:c1 Title:@"title here" SubTitle:@"subtitle here"]; ad1.image = [UIImage imageNamed:@"img01.png"]; [mapView addAnnotation:ad1]; [ad1 release]; // Point two c1.latitude = 37.835964; c1.longitude = -122.250538; AddressAnnotation* ad2 = [[AddressAnnotation alloc] initWithCoordinate:c1 Title:@"title here" SubTitle:@"subtitle here"]; ad2.image = [UIImage imageNamed:@"img02.png"]; [mapView addAnnotation:ad2]; [ad2 release]; // Point three c1.latitude = 37.8317039; c1.longitude = -122.2454169; AddressAnnotation* ad3 = [[AddressAnnotation alloc] initWithCoordinate:c1 Title:@"title here" SubTitle:@"subtitle here"]; ad3.image = [UIImage imageNamed:@"img03.png"]; [mapView addAnnotation:ad3]; [ad3 release]; //---------------------------------------- } - (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation { if ([annotation isKindOfClass:[AddressAnnotation class]]) { static NSString *AnnotationIdentifier = @"AnnotationIdentifier"; MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier]; if (!pinView) { pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease]; pinView.canShowCallout = YES; pinView.animatesDrop = YES; } else { pinView.annotation = annotation; } UIImageView *leftCalloutView = [[UIImageView alloc] initWithImage:((AddressAnnotation *)annotation).image]; pinView.leftCalloutAccessoryView = leftCalloutView; [leftCalloutView release]; return pinView; } return nil; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [super dealloc]; }

@end



To display your own image instead of the standard pin, create a plain MKAnnotationView instead of aMKPinAnnotationView and set its image property instead of the leftCalloutAccessoryView:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[AddressAnnotation class]])
    {
        static NSString *AnnotationIdentifier = @"AnnotationIdentifier";
        MKAnnotationView *pinView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
        if (!pinView)
        {
            pinView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
            pinView.canShowCallout = YES;
        }
        else
        {
            pinView.annotation = annotation;
        }

        pinView.image = ((AddressAnnotation *)annotation).image;

        return pinView;
    }

    return nil;
}

Note that the MKAnnotationView class doesn't have an animatesDrop property likeMKPinAnnotationView so the annotations won't drop on the map. If a drop animation is required, it will have to be done manually (eg. in didAddAnnotationViews).

posted on 2011-07-27 16:03  风乔  阅读(269)  评论(0编辑  收藏  举报

导航