iOS用户位置保持回弹

我有一个地图,当一个button被按下时,它会显示用户的位置并放大。但是,一旦按下这个button,就不能在地图上滚动,它会一直回到用户的位置。 我需要添加/更改什么? 谢谢。

// Set action for when the refreh button is pressed -(IBAction)refreshMapView:(id)sender { [self refreshMap]; } // Set action for when the show user location button is pressed -(IBAction)getlocation { mapView.showsUserLocation = YES; [self.mapView.userLocation addObserver:self forKeyPath:@"location" options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) context:nil]; } // Display segment button to change map views -(IBAction)changeSeg:(id)sender { if (segment.selectedSegmentIndex == 0) { mapView.mapType = MKMapTypeStandard; } if (segment.selectedSegmentIndex == 1) { mapView.mapType = MKMapTypeSatellite; } if (segment.selectedSegmentIndex == 2) { mapView.mapType = MKMapTypeHybrid; } } // Listen to change in the userLocation -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { MKCoordinateRegion region; region.center = self.mapView.userLocation.coordinate; MKCoordinateSpan span; span.latitudeDelta = 0.2; // Change these values to change the zoom span.longitudeDelta = 0.2; region.span = span; [self.mapView setRegion:region animated:YES]; } // Load everying when map tab is accessed -(void)viewDidLoad { // Load mapView from MKMapKit [super viewDidLoad]; mapView = [[MKMapView alloc] initWithFrame:self.view.bounds]; [self.view insertSubview:mapView atIndex:0]; [mapView setMapType:MKMapTypeStandard]; [mapView setZoomEnabled:YES]; [mapView setScrollEnabled:YES]; [mapView setDelegate:self]; // Display WCCCA HQ annotation pin. MKCoordinateRegion WCCCA = { {0.0, 0.0} , {0.0, 0.0} }; WCCCA.center.latitude = 45.53540820864449; WCCCA.center.longitude = -122.86178648471832; WCCCA.span.longitudeDelta = 0.02f; WCCCA.span.latitudeDelta = 0.02f; [mapView setRegion:WCCCA animated:YES]; Annotation *ann1 = [[Annotation alloc] init]; ann1.title = @"WCCCA"; ann1.subtitle = @"Washington County Consolidated Communications Agency"; ann1.coordinate = WCCCA.center; [mapView addAnnotation: ann1]; // Display call annotations based on xml parser data. NSArray *callsArray = [xmlParser calls]; for (JointCAD *call in callsArray) { NSString *callnumber = [call.callnumber stringByAppendingFormat:@". "]; NSString *callandnumber = [callnumber stringByAppendingString:call.currentCallType]; Annotation *ann = [[Annotation alloc] init]; ann.title = callandnumber; ann.subtitle = [call location]; ann.coordinate = CLLocationCoordinate2DMake([call.latitude doubleValue], [call.longitude doubleValue]); [mapView addAnnotation:ann]; } } // Annotation details. -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { // Set user location annotation to blue point instead of red pin if ([annotation isKindOfClass:[MKUserLocation class]]) return nil; MKPinAnnotationView *MyPin=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"current"]; MyPin.pinColor = MKPinAnnotationColorRed; UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [advertButton addTarget:self action:@selector(button:) forControlEvents:UIControlEventTouchUpInside]; // MyPin.rightCalloutAccessoryView = advertButton; MyPin.draggable = NO; MyPin.highlighted = YES; MyPin.animatesDrop= TRUE; MyPin.canShowCallout = YES; return MyPin; } // Set default view when accessing Maps tab. - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; CLLocationCoordinate2D coord = {.latitude = 45.422424, .longitude = -122.76}; MKCoordinateSpan span = {.latitudeDelta = 0.60, .longitudeDelta = 0.60}; MKCoordinateRegion region = {coord, span}; [mapView setRegion:region]; } @end 

getlocation方法中,您将showsUserLocation设置为YES并使用addObserver开始观察对用户位置的addObserver

所以每当用户位置发生变化时(无论是移动设备还是更新位置), observeValueForKeyPath触发observeValueForKeyPath方法。 在该方法中,您将重置地图的区域以居中用户位置。

用户在其他位置平移或缩放后,如果发生另一个用户位置更改,该方法将再次触发,地图将返回到用户位置。

在你的情况下最简单的修复就是在第一次缩放到用户位置后停止观察。 在observeValueForKeyPath方法中,在setRegion行之后,添加:

 [self.mapView.userLocation removeObserver:self forKeyPath:@"location"]; 

请注意,从iOS 4.0开始,您不需要使用KVO(所有addObserver的东西)来观察用户位置的变化。 相反,您可以使用didUpdateUserLocation委托方法。

从iOS 5.0开始,缩放到用户位置的另一个选项是将地图视图的userTrackingModeMKUserTrackingModeFollowMKUserTrackingModeFollowWithHeading 。 这样,您不必手动设置区域。 地图会缩放并跟随用户,但仍可让用户随意平移或缩放。