Search code examples
android-mapviewios5mkannotationmkoverlay

Having Placemark/Annotation in the center of your mapView, even if you scroll


I've spent many hours trying to figure how to do this:

enter image description here

Having a placemark/annotation in the centerCoordinate of your mapView, when you scroll the map, the placemark should always stays in the center.

I've seen another app doing this too!


Solution

  • Found my question in How to add annotation on center of map view in iPhone?

    There's the answer :

    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;
    }