自定义注释苹果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议采取以下方法:
-
将
NSString
types的imageName
属性添加到您的Annotation
类中。 在你调用addAnnotation
之前,将这个属性设置为注解使用的图像名称。 例如:myAnn.title = @"Arsenal FC"; myAnn.subtitle = @"The Gunners"; myAnn.imageName = @"arsenal"; [locations addObject:myAnn];
-
在
viewForAnnotation
委托方法中,检查注释是否为Annotation
types,然后使用其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中,将delegate
sockets连接到视图控制器。
您可以使用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]; }