2011-12-19 116 views
1

我通常在iOS 4.3中运行此代码。但是当我将项目更改为iOS 5.0时,我无法滚动和缩放地图。MKMapView无法滚动和放大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]; 
    } 
} 

回答

0

的代码被观察到的变化的用户位置和更新地图的区域,以一些固定区域当这种情况发生。

在iOS 5.0之前的iOS模拟器中,用户位置变化未被模拟,因此位置变化观察者方法不会触发或不频繁触发。所以如果你滚动或缩放地图,地图将保持这种方式,直到观察者方法被解雇(可能永远不会)。

在iOS 5.0的iOS模拟器中,用户位置更改(或可以)被模拟。在iOS模拟器的调试菜单下,有一个位置子菜单。如果此设置为None,则用户位置更改事件将发生并导致观察者方法触发。如果“位置”设置为“城市自行车骑行”,“城市运行”或“高速公路驱动器”,则用户位置将更改频繁。

由于每次用户位置发生变化时,您的观察者方法都会将地图的区域重新设置为某个固定区域,因此您对地图执行的任何滚动或缩放几乎都会立即未完成。

将位置设置更改为无或自定义位置(只会触发一次)。


不相关的一点是您不需要使用KVO来观察用户位置的更改。除非您的应用程序需要在iOS 3.0或更低版本上运行,否则应该使用MKMapViewDelegate方法mapView:didUpdateUserLocation:

+0

安娜你说得对,我使用mapView:didUpdateUserLocation:现在工作正常,非常感谢! – 2011-12-21 09:51:46