mkmapview MKUserLocation AnnotationView

I’m trying to create custom annotationviews for the annotations on my map. I’m doing that by adapting the protocol MKMapViewDelegate and overwriting the function mapView:viewForAnnotation:. It all works, the only problem is that I also have showsUserLocation set to TRUE, which means that one “Annotation” I get in my mapView:viewForAnnotation: method is of the class MKUserLocation.

I don’t want the userlocation annotation to have my custom annotationview, I want that one to show the default userlocation annotationview! How do I return the default userlocation annotationview for the userlocation or exclude it from the annotations (that come in mapView:viewForAnnotation:)?

  • C++ classes as instance variables of an Objective-C class
  • NSMutableString stringByReplacingOccurrencesOfString Warning
  • NSDate date method returns wrong result
  • Masking and Reverse Masking in Imageview ios
  • Keyboard Scroll on Active Text Field - Scrolling to Out of View?
  • Quartz Core Import not required in Xcode 5?
  • I have tried to catch the UserLocation in the mapView:viewForAnnotation: method, but I don’t know what to return! (In this example I’m returning a standard MKAnnotationView, but that doesn’t look like the default UserLocation Annotation (obviously).)

        if (![[annotation class] isEqual:[MKUserLocation class]]) {
    
            MKAnnotationView *view = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"customAnnotation"];
            // edit the custom view
            return view;
        }
    
        MKAnnotationView *view = [[MKAnnotationView alloc] init];
        return view;
    

    4 Solutions Collect From Internet About “mkmapview MKUserLocation AnnotationView”

    to show the default annotation for user location just return nil for that case, I did it this way:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        // use your custom annotation
        if ([annotation isKindOfClass:[MyAnnotationClass class]]) {
            ...
    
            return annotationView;
        }
    
        // use default annotation
        return nil;
    }
    

    Inside your viewForAnnotation method write this piece of code. Here the var ‘map’ is the outlet for your MKMapview;

       - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
        {
    
    
    
            //Annoation View for current Location
    
            if(map.userLocation != annotation)
    
            {
                UIImage *image = [UIImage imageNamed:@"image.png"];
                annotation.image = image;
    
                return annotation; 
    
    
            }
    
            //Annotation View for current location
    
             return nil;
    
        }
    

    Create custom AnnotationView:

    #import <MapKit/MapKit.h>
    
    @interface AnnotationView : MKPlacemark
    
    @property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate;
    
    @property (nonatomic, strong) NSString *title;
    @property (nonatomic, strong) NSString *subtitle;
    
    // you can put here any controllers that you want. (such like UIImage, UIView,...etc)
    
    @end
    

    And in .m file

    #import "AnnotationView.h"
    
    @implementation AnnotationView
    
    - (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary
    {
        if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary]))
        {
            self.coordinate = coordinate;
        }
        return self;
    }
    
    @end
    

    // Use Annotation Add #import "AnnotationView.h" in your relevant .m file:

    CLLocationCoordinate2D pCoordinate ;
    pCoordinate.latitude = LatValue;
    pCoordinate.longitude = LanValue;
    
    // Create Obj Of  AnnotationView class  
    
    AnnotationView *annotation = [[AnnotationView alloc] initWithCoordinate:pCoordinate addressDictionary:nil] ;
    
        annotation.title = @"I m Here";
        annotation.subtitle = @"This is Sub Tiitle";
    
    [self.mapView addAnnotation:annotation];
    

    Above is simple Example of how to create AnnotationView.

    If the object in the annotation parameter is an instance of the MKUserLocation class, you can provide a custom view to denote the user’s location. To display the user’s location using the default system view, return nil.
    If you do not implement this method, or if you return nil from your implementation for annotations other than the user location annotation, the map view uses a standard pin annotation view.

       - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation
        {
    
           // if it's the user location, just return nil or custom annotation view.
           if ([annotation isKindOfClass:[MKUserLocation class]]){
              return nil;
           } else {
              //return other annotations
           }
    
        }