Search code examples
iosobjective-ccocoa-touchmkmapview

iOS - MKMapView showAnnotations:animated: with padding?


I want to be able to zoom my MKMapView to fit it's annotations. I have managed to do it using iOS7's showAnnotations method. But I would also like to add some padding or inset from the map view border. This is because I have a semi-transperant view that overlays the top part of my map, and I don't want annotations to be places behind this view. I have tried this:

[self.mapView showAnnotations:annotations animated:YES];
[self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:NO];

But it's not working as I would have hoped. Any ideas on how I could do it differently?


Solution

  • You are doing it the right way. Try changing the padding, you'll see the difference.

    Other way, there must be something else in your code preventing from changing the view

    EDIT: I was totally wrong. Try this:

    Create an instance variable

    BOOL _mapNeedsPadding;
    

    and initialize it to NO;

    Then set your mapView delegate to self and add a to your class header

    Then add this to your class

    - (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
        if(_mapNeedsPadding){
            _mapNeedsPadding = NO;
            [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES];
        }
    }
    

    And finally call your showAnnotations function like this:

    _mapNeedsPadding = YES;
    [self.mapView showAnnotations:annotations animated:YES];
    

    The showAnnimation will trigger the regionDidChangeAnimated function. You need to set _mapNeedsPadding to NO after changing visibleMapRect because this function (setVisibleMapRect:self) will also trigger regionDidChangeAnimated.

    Hope this helps !