Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS: Adding image to custom MKAnnotationview

I want to add a custom image to my annotations in the map. And i have made the following custom MapAnnotationView:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@class POI;

@interface MapAnnotation : MKAnnotationView <MKAnnotation >

@property (nonatomic) CGFloat lat; 
@property (nonatomic) CGFloat lon;
@property (nonatomic) CGFloat altitude; 
@property (nonatomic,  copy) NSString * title;
@property (nonatomic, copy) NSString * subtitle;
@property (nonatomic,retain) NSString *source;
@property (nonatomic,retain) UIImage  *image;

@end

@implementation MapAnnotation
@synthesize coordinate;
@synthesize lat=_lat,lon=_lon,altitude= _altitude;
@synthesize subtitle= _subtitle, title= _title, source=_source, image =_img;


- (CLLocationCoordinate2D)coordinate;{
    CLLocationCoordinate2D position;
    if (_lat != 0.0 && _lon != 0.0) {
        position.latitude = _lat;
        position.longitude = _lon;

    }else {
        position.latitude=0.0;
        position.longitude=0.0;
    }

    return position; 
}

@end

-(void) mapDataToMapAnnotations{

    NSMutableArray *toRemove = [NSMutableArray arrayWithCapacity:10];
    for (id annotation in _map.annotations)
        if (annotation != _map.userLocation)
            [toRemove addObject:annotation];
    [_map removeAnnotations:toRemove];

    [_data removeAllObjects];

    [_data addObjectsFromArray:[UDdelegate naturArray]];


    if(_data != nil){
        MapAnnotation * tmpPlace;
        //for(NSDictionary * poi in _data){


        for(POI* poi in _data){

            tmpPlace = [[MapAnnotation alloc]init];

            tmpPlace.title = [poi title];
            tmpPlace.lat = [poi lat];
            tmpPlace.lon = [poi lon];
            tmpPlace.subtitle = [poi dist];
            tmpPlace.image = [poi poiIcon];

            [self.map addAnnotation:tmpPlace];
            [_map setNeedsLayout];
        }
    }
}

The problem is that the pins is the standard redPin.... I am sure that the icons isn't null, have checked for that.

Thanks

like image 902
Roskvist Avatar asked Mar 09 '12 09:03

Roskvist


1 Answers

You have to serve the MapKit delegate method mapView:viewForAnnotation: with a custom view.

- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation
{
    static NSString *annotationViewReuseIdentifier = @"annotationViewReuseIdentifier";

    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationViewReuseIdentifier];

    if (annotationView == nil)
    {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationViewReuseIdentifier] autorelease];
    }

    annotationView.image = [UIImage imageNamed:@"pin_image.png"];
    annotationView.annotation = annotation;

    return annotationView;
}

To encapsulate more you should create a custom annotation view like you did and serve the delegate method above with your class.

I advise you to rename the MapAnnotation class because it is confusing. There are also Annotations in iOS which are the data holders for those annotation views. To solve this I would prefer to write the type of the inherited class, in this case MKAnnotationView at the end of your custom class. For example CustomPinAnnotationView.

like image 70
Martin Stolz Avatar answered Sep 21 '22 12:09

Martin Stolz