2012-08-30 38 views
1

我有一个地图,当按下按钮时,它会显示用户的位置并放大。但是,一旦按下该按钮,就不能在地图上滚动,它会一直对齐用户的位置。我需要添加/更改什么?谢谢。iOS用户位置保持对齐

// 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 

回答

3

getlocation方法设置showsUserLocationYES,并开始观察更改使用addObserver用户位置。

因此,无论何时用户位置发生变化(无论是在设备移动还是获取更新位置时),都会触发该方法。在该方法中,您将重置地图的区域以居中用户位置。

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

您的案例中最简单的修复方法是在第一次缩放到用户位置后停止观察。在observeValueForKeyPath法,setRegion行后,添加:

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


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

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