views:

125

answers:

0

Setting the region in MKMapView occasionally results in the span being doubled. This bug seems to appear early in the map initialization phase. Although it's been reported elsewhere I wasn't able to find a descent existing workaround, so I'm posting my fix here. It relies on the fact that the regionThatFits method also produces the bug. I'm working with iPhone OS 3.12, but the bug was reported in 3.0 beta. This code lives in the UIViewController that contains your MKMapView:

    - (BOOL)doubleSpanBugDetected:(MKCoordinateRegion)region fittedRegion:(MKCoordinateRegion)fitted
{
  float latRatio = fitted.span.latitudeDelta / region.span.latitudeDelta;
  float lonRatio = fitted.span.longitudeDelta / region.span.longitudeDelta;
  BOOL latDoubled = (latRatio > 1.8 && latRatio < 2.2); // within 10% of x2
  BOOL lonDoubled = (lonRatio > 1.8 && lonRatio < 2.2); // within 10% of x2
  return latDoubled && lonDoubled;
}

- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated
{
  //fixes setRegion span doubling bug
  // see: http://osmorphis.blogspot.com/2009/12/mapkit-span-doubling-bug.html
  // see: http://www.iphonedevsdk.com/forum/iphone-sdk-development/15810-mkmapview-needs-time-think.html
  MKCoordinateRegion fitted = [self.mapView regionThatFits:region];
  if ([self doubleSpanBugDetected:region fittedRegion:fitted]) {
    MKCoordinateSpan span = MKCoordinateSpanMake(fitted.span.latitudeDelta/2.0, fitted.span.longitudeDelta/2.0);
    MKCoordinateRegion regionHack = MKCoordinateRegionMake(fitted.center, span); 
    [self.mapView setRegion:regionHack animated:animated];     
  } else {
    [self.mapView setRegion:fitted animated:animated];
  }
}