Search code examples
iphoneannotationsmkmapviewcenter

How to add annotation on center of map view in iPhone?


I have MAP view in my app and i want to add Annotation pin (Red pin) on center of map view.
Now when user scroll map view pin should adjust with center according to that.
How to do that?
Thank


Solution

  • If you want to use an actual annotation instead of just a regular view positioned above the center of the map view, you can:

    • use an annotation class with a settable coordinate property (pre-defined MKPointAnnotation class eg). This avoids having to remove and add the annotation when the center changes.
    • create the annotation in viewDidLoad
    • keep a reference to it in a property, say centerAnnotation
    • update its coordinate (and title, etc) in the map view's regionDidChangeAnimated delegate method (make sure map view's delegate property is set)

    Example:

    @interface SomeViewController : UIViewController <MKMapViewDelegate> {
        MKPointAnnotation *centerAnnotation;
    }
    @property (nonatomic, retain) MKPointAnnotation *centerAnnotation;
    @end
    
    @implementation SomeViewController
    
    @synthesize centerAnnotation;
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        MKPointAnnotation *pa = [[MKPointAnnotation alloc] init];
        pa.coordinate = mapView.centerCoordinate;
        pa.title = @"Map Center";
        pa.subtitle = [NSString stringWithFormat:@"%f, %f", pa.coordinate.latitude, pa.coordinate.longitude];
        [mapView addAnnotation:pa];
        self.centerAnnotation = pa;
        [pa release];
    }
    
    - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
        centerAnnotation.coordinate = mapView.centerCoordinate;
        centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude]; 
    }
    
    - (void)dealloc {
        [centerAnnotation release];
        [super dealloc];
    }
    
    @end
    

    Now this will move the annotation but not smoothly. If you need the annotation to move more smoothly, you can add a UIPanGestureRecognizer and UIPinchGestureRecognizer to the map view and also update the annotation in the gesture handler:

        // (Also add UIGestureRecognizerDelegate to the interface.)
    
        // In viewDidLoad:
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        panGesture.delegate = self;
        [mapView addGestureRecognizer:panGesture];
        [panGesture release];
    
        UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)];
        pinchGesture.delegate = self;
        [mapView addGestureRecognizer:pinchGesture];
        [pinchGesture release];
    
    - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
    {
        centerAnnotation.coordinate = mapView.centerCoordinate;
        centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude]; 
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        //let the map view's and our gesture recognizers work at the same time...
        return YES;
    }