MKMapView无法在iOS 5.0中滚动和缩放

时间:2011-12-19 07:13:36

标签: ios ios5 mkmapview

我在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];
    }
}

1 个答案:

答案 0 :(得分:0)

代码正在观察用户位置的变化,并在发生这种情况时将地图的区域更新到某个固定区域。

在iOS 5.0之前的iOS模拟器中,未模拟用户位置更改,因此位置更改观察器方法不会激发或不会频繁触发。因此,如果您滚动或缩放地图,地图将保持这种状态,直到观察者方法被触发(可能永远不会)。

在适用于iOS 5.0的iOS模拟器中,可以(或可以)模拟用户位置更改。在iOS模拟器的调试菜单下,有一个位置子菜单。如果将此设置为None,则会发生用户位置更改事件并导致观察者方法触发。如果位置设置为City Bicycle Ride,City Run或Freeway Drive,则用户位置将非常频繁地更改。

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

将“位置”设置更改为“无”或“自定义位置”(仅触发一次)。


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