我在iOS 4.3中正常运行这段代码。但是当我将项目更改为iOS 5.0时,我无法滚动和缩放地图。
谁能告诉我为什么会有这个问题?我怎么解它?代码是:
- (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];
}
}
代码正在观察用户位置的变化,并在发生变化时将地图的区域更新为某些固定区域。
在ios5.0之前的iOS Simulator中,用户位置变化没有被模拟,因此位置变化观察者方法要么不触发,要么不频繁触发。因此,如果你滚动或缩放地图,地图将保持这种状态,直到观察者方法触发(可能永远不会)。
在iOS 5.0的iOS模拟器中,用户的位置变化是(或可以)模拟的。在iOS模拟器的Debug菜单下,有一个Location子菜单。如果该值设置为None以外的任何值,则会发生用户位置更改事件并导致observer方法被触发。如果"位置"设置为"城市自行车骑行"、"城市跑步"或"高速公路驾驶",则用户的位置将非常频繁地变化。
因为你的观察者方法是在每次用户位置改变时将地图的区域重新设置为某个固定区域,所以你对地图所做的任何滚动或缩放几乎都会立即取消。
将位置设置更改为None或Custom Location(只会触发一次)。
与此无关的一点是,您不需要使用KVO来观察用户位置的变化。除非你的应用需要在iOS 3.0或更早的版本上运行,否则你应该使用MKMapViewDelegate
方法mapView:didUpdateUserLocation:
。