MKPinAnnotationView: Are there more than three colors available?
Asked Answered
I

9

39

According to the Apple docs, MKPinAnnotationView's pin color is available in red, green and purple. Is there any way to get other colors also? I've found nothing in the docs.

Indole answered 26/7, 2009 at 21:32 Comment(1)
You could use ZSPinAnnotation to create annotation pins on the fly with a specified UIColor: github.com/nnhubbard/ZSPinAnnotationMama
E
40

You might find the following images useful:

alt text alt text alt text alt text

and the code to use them in viewForAnnotation:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{   
    // ... get the annotation delegate and allocate the MKAnnotationView (annView)
    if ([annotationDelegate.type localizedCaseInsensitiveCompare:@"NeedsBluePin"] == NSOrderedSame)
    {
        UIImage * image = [UIImage imageNamed:@"blue_pin.png"];
        UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
        [annView addSubview:imageView];
    }
    // ...
Electrostatic answered 26/12, 2009 at 14:9 Comment(1)
No problem. Glad you found them useful.Electrostatic
C
81

some more ;)

alt text enter image description hereenter image description here

alt text enter image description hereenter image description here

And the original ones :

alt text alt text enter image description here

alt text alt text enter image description here

alt text alt text enter image description here

And the code:

- (MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView* anView =[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"test"];
anView.pinColor=MKPinAnnotationColorPurple;
UIImage* image = nil;
// 2.0 is for retina. Use 3.0 for iPhone6+, 1.0 for "classic" res.
UIGraphicsBeginImageContextWithOptions(anView.frame.size, NO, 2.0);
[anView.layer renderInContext: UIGraphicsGetCurrentContext()];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData* imgData = UIImagePNGRepresentation(image);
NSString* targetPath = [NSString stringWithFormat:@"%@/%@", [self writablePath], @"thisismypin.png" ];
[imgData writeToFile:targetPath atomically:YES]; 
return anView;
}

-(NSString*) writablePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return documentsDirectory;
}
Counterattraction answered 14/1, 2010 at 18:24 Comment(12)
Hi, how did you get the original pins? Thanks. Are there @2x versions available?Brame
I ran a piece of code in the simulator that writes the UIImage to the file system using UIImagePNGRepresentation(yourImage). Image -> NSData -> fileSystem. I don't have the @2x versions available :/Counterattraction
matt, I added the retina display for the pins. and also the code used to render them.Counterattraction
The image link is broken. You can please fix 'em? DankeN
strange because you are right, some time ago the links were broken BUT right now I can see them back .... :/ Don't you see them ?Counterattraction
strange, now I don't see them again :( what's happening with imagur.com ?Counterattraction
Is there anything that can be done so that the pin drop animation doesnt cause the original color to show when it touches down?Woven
Do you have a retina sized image for the yellow pin?Tetreault
Can you by chance also post the hi-res images for the orange and gray ones?Darnley
@Counterattraction Thank you so much! How do you create these?Darnley
@DeanLeitersdorf actually I get the original Apple ressource from the pasted code here and then I manually adjust the color of the top part of the pin using photoshopCounterattraction
I've added a github repo extracting some of the common colors. github.com/StevenTso/MKPinAnnotationViewColoredPinsZerk
E
40

You might find the following images useful:

alt text alt text alt text alt text

and the code to use them in viewForAnnotation:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{   
    // ... get the annotation delegate and allocate the MKAnnotationView (annView)
    if ([annotationDelegate.type localizedCaseInsensitiveCompare:@"NeedsBluePin"] == NSOrderedSame)
    {
        UIImage * image = [UIImage imageNamed:@"blue_pin.png"];
        UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease];
        [annView addSubview:imageView];
    }
    // ...
Electrostatic answered 26/12, 2009 at 14:9 Comment(1)
No problem. Glad you found them useful.Electrostatic
M
11

You could use ZSPinAnnotation to create annotation pins on the fly with a specified UIColor: https://github.com/nnhubbard/ZSPinAnnotation

Mama answered 19/1, 2012 at 18:57 Comment(2)
Hey @Nic-Hubbard - thanks for sharing the code. Is the reason you wouldn't add this as a category on MKAnnotation to let you set pinView.image = [MKAnnotation pinAnnotationWithColor:a.color]Triplenerved
@Triplenerved No reason really, I guess I didn't think about it at the time!Mama
F
8

I like Yonel's Answer but just a heads up, when you create a custom MKAnnotationView, you'll have to manually assign the offset. For the images Yonel provided: (you can leave out the calloutButton stuff if you don't need one of those)

#pragma mark MKMapViewDelegate
- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if(![annotation isKindOfClass:[MyAnnotation class]]) // Don't mess user location
        return nil;

    MKAnnotationView *annotationView = [aMapView dequeueReusableAnnotationViewWithIdentifier:@"spot"];
    if(!annotationView)
    {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"spot"];
        annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [(UIButton *)annotationView.rightCalloutAccessoryView addTarget:self action:@selector(openSpot:) forControlEvents:UIControlEventTouchUpInside];
        annotationView.enabled = YES;
        annotationView.canShowCallout = YES;
        annotationView.centerOffset = CGPointMake(7,-15);
        annotationView.calloutOffset = CGPointMake(-8,0);
    }

    // Setup annotation view
    annotationView.image = [UIImage imageNamed:@"pinYellow.png"]; // Or whatever

    return annotationView;
}
Falconet answered 31/5, 2010 at 17:59 Comment(1)
By the way, if the annotationView successfully dequeues the annotation view, you need to update its annotation property. E.g., you'd generally have a if (!annotationView) { ... } else { annotationView.annotation = annotation; }.Pomelo
D
4

And here is the PSD for the pin with shadow and its in @2x size.

http://dl.dropbox.com/u/5622711/ios-pin.psd

Use this PSD for any color you want :)

I take no credit for this PSD. I just grabbed it from http://www.teehanlax.com/downloads/iphone-4-guid-psd-retina-display/ They have done a wonderful job!

Delozier answered 23/12, 2011 at 22:9 Comment(0)
S
4

With iOS 9, pinTintColor has been added to MKPinAnnotationView, allowing you to supply a UIColor for the pin color.

Swamper answered 14/10, 2015 at 13:29 Comment(0)
M
3

Neither of the posted solutions work 100% if you are using the pin drop animation. Cannonade's solution is very neat because it allows the pin to still have both kinds of ends (the sharp point when falling and the one with the circular paper ripple) but unfortunately a glimpse of the original pin head colour can be seen when the pin bounces as it hits the map. yonel's solution of replacing the whole pin image means the pin falls with the circular paper ripple before it's even hit the map!

Manama answered 30/11, 2010 at 20:39 Comment(0)
P
2

I tried this way and it seems to be ok...

UIImage * image = [UIImage imageNamed:@"blue_pin.png"];
        UIImageView *imageView = [[[UIImageView alloc] initWithImage:image]
                                 autorelease];
        [annotationView addSubview:imageView];
        annotationView = nil;

using the complete pin image... as the yonel example

Plenum answered 18/11, 2010 at 17:0 Comment(1)
Only code that works in iOS 8 (other answers do nothing). Thanks!Darnley
H
1

If it's not in the docs then most probably not, you cAn use mkannotationview and have ur own image if u wish though

Hyperactive answered 26/7, 2009 at 22:19 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.