iOS用户位置不断回归

时间:2012-08-30 22:44:15

标签: iphone objective-c ios xcode mkmapview

我有一张地图,当按下按钮时,它会显示用户的位置并放大。但是,按下该按钮后,您无法在地图上滚动,它会一直回到用户的位置。我需要添加/更改什么?谢谢。

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

1 个答案:

答案 0 :(得分:3)

getlocation方法中,您将showsUserLocation设置为YES,然后使用addObserver开始观察用户位置的更改。

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

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

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

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


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

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