自定义注释苹果mapkit

我正在尝试分配两个自定义注释,一个名为“arsenal.png”,一个名为“chelsea.png”

使用苹果mapkit框架,xcode 7。

需要代码帮助来实现自定义的标记。

这里是我的实现文件:

// TrucksViewController.m #import "TrucksViewController.h" #import "Annotation.h" @interface TrucksViewController () @end //Wimbledon Coordinates #define WIMB_LATITUDE 51.434783; #define WIMB_LONGITUDE -0.213428; //Stadium Coordinates #define ARSENAL_LATITUDE 51.556899; #define ARSENAL_LONGITUDE -0.106483; #define CHELSEA_LATITUDE 51.481314; #define CHELSEA_LONGITUDE -0.190129; //Span #define THE_SPAN 0.20f; @implementation TrucksViewController @synthesize myMapView; #pragma mark - #pragma mark Initialisation - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { self.title = @"Trucks"; [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; } return self; } #pragma mark - #pragma mark UIViewController Delegates - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewDidUnload { [super viewDidUnload]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Update support iOS 7 if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIRectEdgeNone; self.navigationController.navigationBar.translucent = NO; } } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // Revert to default settings if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIRectEdgeAll; } } - (void)viewDidLoad { [super viewDidLoad]; //Create Region MKCoordinateRegion myRegion; //Center CLLocationCoordinate2D center; center.latitude = ARSENAL_LATITUDE; center.longitude = ARSENAL_LONGITUDE; //Span MKCoordinateSpan span; span.latitudeDelta = THE_SPAN; span.longitudeDelta = THE_SPAN; //Region myRegion.center = center; myRegion.span = span; //Set our mapview [myMapView setRegion:myRegion animated:YES]; //Annotation NSMutableArray * locations = [[NSMutableArray alloc] init]; CLLocationCoordinate2D location; Annotation * myAnn; //Arsenal annotation myAnn = [[Annotation alloc] init]; location.latitude = ARSENAL_LATITUDE; location.longitude = ARSENAL_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Arsenal FC"; myAnn.subtitle = @"The Gunners"; [locations addObject:myAnn]; //Chelsea annotation myAnn = [[Annotation alloc] init]; location.latitude = CHELSEA_LATITUDE; location.longitude = CHELSEA_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Chelsea FC"; myAnn.subtitle = @"The Blue Lions"; [locations addObject:myAnn]; [self.myMapView addAnnotations:locations]; } @end 

添加张贴12/11/2013 18:31小时东部

更新Annotations.h文件

 #import <Foundation/Foundation.h> #import <MapKit/MapKit.h> @interface Annotation : NSObject <MKAnnotation> @property(nonatomic, assign) CLLocationCoordinate2D coordinate; @property(nonatomic, copy) NSString * title; @property(nonatomic, copy) NSString * subtitle; @property(nonatomic, copy) NSString * imageName; @end 

更新了Annotations.m文件

 #import "Annotation.h" @implementation Annotation @synthesize coordinate, title, subtitle, imageName; @end 

更新了TrucksViewController.h

 #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> @interface TrucksViewController : UIViewController { } @property (weak, nonatomic) IBOutlet MKMapView *myMapView; @end 

更新了TrucksViewController.m

(代码片段)

 //Arsenal annotation myAnn = [[Annotation alloc] init]; location.latitude = ARSENAL_LATITUDE; location.longitude = ARSENAL_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Arsenal FC"; myAnn.subtitle = @"The Gunners"; myAnn.imageName = @"arsenal"; [locations addObject:myAnn]; //Chelsea annotation myAnn = [[Annotation alloc] init]; location.latitude = CHELSEA_LATITUDE; location.longitude = CHELSEA_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Chelsea FC"; myAnn.subtitle = @"The Blue Lions"; myAnn.imageName = @"chelsea"; [locations addObject:myAnn]; [self.myMapView addAnnotations:locations]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

这里是我更新的TrucksViewController.m文件: 12/11/2013在20:07东部

 // TrucksViewController.m #import "TrucksViewController.h" #import "Annotation.h" @interface TrucksViewController () @end //Wimbledon Coordinates #define WIMB_LATITUDE 51.434783; #define WIMB_LONGITUDE -0.213428; //Stadium Coordinates #define ARSENAL_LATITUDE 51.556899; #define ARSENAL_LONGITUDE -0.106483; #define CHELSEA_LATITUDE 51.481314; #define CHELSEA_LONGITUDE -0.190129; //Span #define THE_SPAN 0.20f; @implementation TrucksViewController @synthesize myMapView; //insert code per Anna -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation: (id<MKAnnotation>)annotation { if ([annotation isKindOfClass:[Annotation class]]) { static NSString *reuseId = @"ann"; MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if (av == nil) { av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId]; } else { av.annotation = annotation; } Annotation *ann = (Annotation *)annotation; av.image = [UIImage imageNamed:ann.imageName]; return av; } //return nil (default view) if annotation is not our custom type return nil; } //end new code per Anna #pragma mark - #pragma mark Initialisation - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { // Set the title for this view controller // Note: In future we will copy over the title from any created UINavigationBar objects self.title = @"Trucks"; [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; } return self; } #pragma mark - #pragma mark UIViewController Delegates - (void)viewDidUnload { [super viewDidUnload]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Update support iOS 7 if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIRectEdgeNone; self.navigationController.navigationBar.translucent = NO; } } -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; // Revert to default settings if ([self respondsToSelector:@selector(edgesForExtendedLayout)]) { self.edgesForExtendedLayout = UIRectEdgeAll; } } - (void)viewDidLoad { [super viewDidLoad]; //Create Region MKCoordinateRegion myRegion; //Center CLLocationCoordinate2D center; center.latitude = ARSENAL_LATITUDE; center.longitude = ARSENAL_LONGITUDE; //Span MKCoordinateSpan span; span.latitudeDelta = THE_SPAN; span.longitudeDelta = THE_SPAN; //Region myRegion.center = center; myRegion.span = span; //Set our mapview [myMapView setRegion:myRegion animated:YES]; //Annotation NSMutableArray * locations = [[NSMutableArray alloc] init]; CLLocationCoordinate2D location; Annotation * myAnn; //Arsenal annotation myAnn = [[Annotation alloc] init]; location.latitude = ARSENAL_LATITUDE; location.longitude = ARSENAL_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Arsenal FC"; myAnn.subtitle = @"The Gunners"; myAnn.imageName = @"arsenal.png"; [locations addObject:myAnn]; //Chelsea annotation myAnn = [[Annotation alloc] init]; location.latitude = CHELSEA_LATITUDE; location.longitude = CHELSEA_LONGITUDE; myAnn.coordinate = location; myAnn.title = @"Chelsea FC"; myAnn.subtitle = @"The Blue Lions"; myAnn.imageName = @"chelsea.png"; [locations addObject:myAnn]; [self.myMapView addAnnotations:locations]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end 

您需要实现viewForAnnotation委托方法来显示您的注释图像,而不是标准的红色针脚。

在该委托方法中,您需要创build并返回一个MKAnnotationView ,并将其image属性设置为所需的批注图像。

您将获得对地图视图要求查看和使用注释属性的注释的引用,请相应地设置图像。

可以根据注解的title值,但我build议采取以下方法:

  1. NSStringtypes的imageName属性添加到您的Annotation类中。 在你调用addAnnotation之前,将这个属性设置为注解使用的图像名称。 例如:

     myAnn.title = @"Arsenal FC"; myAnn.subtitle = @"The Gunners"; myAnn.imageName = @"arsenal"; [locations addObject:myAnn]; 
  2. viewForAnnotation委托方法中,检查注释是否为Annotationtypes,然后使用其imageName属性来设置注释视图的image属性:

     -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { if ([annotation isKindOfClass:[Annotation class]]) { static NSString *reuseId = @"ann"; MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; if (av == nil) { av = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId]; } else { av.annotation = annotation; } Annotation *ann = (Annotation *)annotation; av.image = [UIImage imageNamed:ann.imageName]; return av; } //return nil (default view) if annotation is not our custom type return nil; } 

另外,不要忘记设置地图视图的delegate属性,否则委托方法将不会被调用。 在Interface Builder中,将delegatesockets连接到视图控制器。

您可以使用viewForAnnotation委托方法来创build自定义注释。

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation 

看下面的教程

http://www.codigator.com/tutorials/advanced-mapkit-tutorial-for-ios-custom-callout/

http://ios-funda.blogspot.in/2012/08/custom-annotations-example.html

编辑

你需要在viewDidLoad中设置委托

 self.myMapView.delegate = self 

现在在.h

 @interface TrucksViewController : UIViewController<MKMapViewDelegate> 

然后执行委托方法

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } static NSString *defaultPinId = @"Pin"; CustomAnnotation *pinView = (CustomAnnotation *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinId]; if (pinView == nil) { pinView = [[CustomAnnotation alloc]initWithAnnotation:annotation reuseIdentifier:defaultPinId]; //pinView.pinColor = MKPinAnnotationColorRed; //pinView.animatesDrop = YES; pinView.canShowCallout = YES; //NSLog(@"%f",[annotation coordinate].latitude); } else { pinView.annotation = annotation; } UIButton *btn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; btn.frame = CGRectMake(275, 27, 30, 30); //Adding a navigation inside a callout view btn.tag = [sid intValue]; //NSLog(@"%i",btn.tag); [btn addTarget:self action:@selector(YOUR_SELECTOR) forControlEvents:UIControlEventTouchUpInside]; pinView.rightCalloutAccessoryView = btn; return pinView; } 

CustomAnnotation.m中添加下面的方法

 -(id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; if (self != nil) { CGRect frame = self.frame; frame.size = CGSizeMake(46.0, 49.0); self.frame = frame; self.backgroundColor = [UIColor clearColor]; self.centerOffset = CGPointMake(-5, -5); } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code [[UIImage imageNamed:@"locatorico"] drawInRect:rect]; }