If I understand correctly, you want to tell mapView to "give me a map that is 636 meters across" or "give me a map that is 900 meters across." But the map gives you the same distance for both of them.
When you set the region of a map, you usually don’t get exactly what you ask for, but they’re best suited. The map view looks at the region you requested, and then creates a region that matches your region within it. The problem is that the map view doesn't exactly come close to your requested region, it finds the highest zoom level that allows you to see your entire region. It will not use an intermediate zoom level. That is why when you use setRegion: map always looks crisp. You can manually set the intermediate zoom level by inserting or pulling, but not (as far as I know) programmatically.
Note that the map view may change the actual region variable that you pass to it. Here are the docs:
When setting up a new area, the map can adjust the value in the area parameter so that it exactly matches the visible area of the map. This is normal and done to ensure that the value in the area property always reflects the visible part of the map. However, this means that if you get the value of this property immediately after calling this method, the return value may not match the value you set. (You can use the regionThatFits: method to determine the area that will actually be defined by the map.)
You can see the difference in the regions by registering the region that you give it to and the one that actually displays the map view (although I did not see the passed myRegion change):
MKCoordinateRegion myRegion = MKCoordinateRegionMakeWithDistance(userLocation, dist, dist); NSLog(@"Passed: %f %f", myRegion.span.latitudeDelta, myRegion.span.longitudeDelta); [self.mapView setRegion:myRegion animated:YES]; NSLog(@"Passed 2: %f %f", myRegion.span.latitudeDelta, myRegion.span.longitudeDelta); NSLog(@"Set: %f %f", mapView.region.span.latitudeDelta, mapView.region.span.longitudeDelta); > Passed: 0.005728 0.008702 > Passed 2: 0.005728 0.008702 > Set: 0.012957 0.013733
If you hit a distance of up to 1200 m, you can see the next zoom level.
By the way, there is a small error in your code:
NSLog(@"distance to western boundary: %.2lfm", [centerRegion distanceFromLocation:north]);
it should be
NSLog(@"distance to northern boundary: %.2lfm", [centerRegion distanceFromLocation:north]);