本文主要是介绍7.5 Displaying Pins with Different Colors on a Map View,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
自定义pin颜色
MyAnnotation.h文件
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#define REUSABLE_PIN_RED @"Red"
#define REUSABLE_PIN_GREEN @"Green"
#define REUSABLE_PIN_PURPLE @"Purple"
@interface MyAnnotation : NSObject <MKAnnotation>
/* unsafe_unretained since this is not an object. We can skip this and leave it to the compiler to decide. weak or strong won't work as this is not an object */
@property (nonatomic, unsafe_unretained, readonly) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
/* unsafe_unretained for the same reason as the coordinate property */
@property (nonatomic, unsafe_unretained) MKPinAnnotationColor pinColor;
- (id) initWithCoordinates:(CLLocationCoordinate2D)paramCoordinates
title:(NSString*)paramTitle
subTitle:(NSString*)paramSubTitle;
+ (NSString *) reusableIdentifierforPinColor:(MKPinAnnotationColor)paramColor;
@end
MyAnnotation.m文件
#import "MyAnnotation.h"
@implementation MyAnnotation
+ (NSString *) reusableIdentifierforPinColor :(MKPinAnnotationColor)paramColor
{
NSString *result = nil;
switch (paramColor){
case MKPinAnnotationColorRed:{
result = REUSABLE_PIN_RED;
break;
}
case MKPinAnnotationColorGreen:{
result = REUSABLE_PIN_GREEN;
break;
}
case MKPinAnnotationColorPurple:{
result = REUSABLE_PIN_PURPLE;
break;
}
}
return result;
}
- (id) initWithCoordinates:(CLLocationCoordinate2D)paramCoordinates
title:(NSString*)paramTitle
subTitle:(NSString*)paramSubTitle
{
self = [super init];
if (self != nil)
{
_coordinate = paramCoordinates;
_title = paramTitle;
_subtitle = paramSubTitle;
_pinColor = MKPinAnnotationColorGreen;
}
return self;
}
@end
ViewController.h文件
#import <UIKit/UIKit.h>
@protocol MKMapViewDelegate;
@interface ViewController : UIViewController<MKMapViewDelegate>
@end
ViewController.m文件
#import <MapKit/MapKit.h>
#import "ViewController.h"
#import "MyAnnotation.h"
@interface ViewController ()
@property (nonatomic, retain) MKMapView * myMapView;
@end
@implementation ViewController
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation
{
MKAnnotationView *result = nil;
if ([annotation isKindOfClass:[MyAnnotation class]] == NO){
return result;
}
if ([mapView isEqual:self.myMapView] == NO){
/* We want to process this event only for the Map View
that we have created previously */
return result;
}
/* First typecast the annotation for which the Map View has fired this delegate message */
MyAnnotation *senderAnnotation = (MyAnnotation *)annotation;
/* Using the class method we have defined in our custom annotation class, we will attempt to get a reusable identifier for the pin we are about
to create */
NSString *pinReusableIdentifier =[MyAnnotation reusableIdentifierforPinColor:senderAnnotation.pinColor];
/* Using the identifier we retrieved above, we will attempt to reuse a pin in the sender Map View */
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinReusableIdentifier];
if (annotationView == nil){
/* If we fail to reuse a pin, then we will create one */
annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:senderAnnotation reuseIdentifier:pinReusableIdentifier];
/* Make sure we can see the callouts on top of each pin in case we have assigned title and/or subtitle to each pin */
[annotationView setCanShowCallout:YES];
}
/* Now make sure, whether we have reused a pin or not, that the color of the pin matches the color of the annotation */
annotationView.pinColor = senderAnnotation.pinColor;
result = annotationView;
return result;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
/* Create a map as big as our view */
self.myMapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
self.myMapView.delegate = self;
/* Set the map type to Standard */
self.myMapView.mapType = MKMapTypeStandard;
self.myMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
/* Add it to our view */
[self.view addSubview:self.myMapView];
/* This is just a sample location */
CLLocationCoordinate2D location;
location.latitude = 24.5;
location.longitude = 118.13;//厦门
/* Create the annotation using the location */
MyAnnotation *annotation =
[[MyAnnotation alloc] initWithCoordinates:location
title:@"My Title"
subTitle:@"My Sub Title"];
annotation.pinColor = MKPinAnnotationColorPurple;
/* And eventually add it to the map */
[self.myMapView addAnnotation:annotation];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
输出:
这篇关于7.5 Displaying Pins with Different Colors on a Map View的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!