I run this code normally in iOS 4.3. But when I change the project to iOS 5.0, I cannot scroll and zoom the map.
Can anybody tell me why has this problem? How can I solve it?
The code is:
- (void)viewDidLoad
{
[super viewDidLoad];
CGRect rect = CGRectMake(0, 0, 320, 460);
map = [[MKMapView alloc] initWithFrame:rect];
map.showsUserLocation = YES;
MKUserLocation *userLocation = map.userLocation;
[userLocation addObserver:self forKeyPath:@"location"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial
context:nil];
map.scrollEnabled = YES;
map.zoomEnabled = YES;
map.mapType = MKMapTypeStandard;
[self.view addSubview:map];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([change objectForKey:NSKeyValueChangeNewKey] != [NSNull null]) {
MKCoordinateRegion region;
CLLocationCoordinate2D testCoordinate;
double lat = 22.195579570451734;
double lng = 113.542275265336;
testCoordinate.latitude = lat;
testCoordinate.longitude = lng;
region.center = testCoordinate;
MKCoordinateSpan span;
span.latitudeDelta = 0.0011;
span.longitudeDelta = 0.0011;
region.span = span;
[map setRegion:region animated:YES];
}
}
The code is observing changes to the user location and updating the map’s region to some fixed region when that happens.
In the iOS Simulator before iOS 5.0, the user location changes were not simulated and so the location change observer method would either not fire or not fire as frequently. So if you scrolled or zoomed the map, the map would stay that way until the observer method fired (probably never).
In the iOS Simulator for iOS 5.0, the user location changes are (or can be) simulated. Under the iOS Simulator’s Debug menu, there is a Location sub-menu. If this is set to anything but None, the user location change event will happen and cause the observer method to fire. If the Location setting is City Bicycle Ride, City Run, or Freeway Drive, the user location will change very frequently.
Since your observer method is re-setting the map’s region to some fixed area every time the user location changes, any scrolling or zooming you do to the map is almost immediately un-done.
Change the Location setting to either None or Custom Location (which will fire only once).
An un-related point is you don’t need to use KVO to observe changes to the user location. Unless your app needs to run on iOS 3.0 or earlier, you should use the
MKMapViewDelegatemethodmapView:didUpdateUserLocation:instead.