1

ボタンを押すとユーザーの位置が表示され、ズームインするマップがあります。ただし、そのボタンを押すと、マップをスクロールできず、ユーザーの位置に戻り続けます。何を追加/変更する必要がありますか? ありがとう。

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

1 に答える 1

3

getlocationに設定showsUserLocationした方法YESで、 を使用してユーザーの場所への変更の監視を開始しますaddObserver

そのため、ユーザーの位置が変更されるたびに (デバイスが移動したとき、または更新された位置が取得されたとき)、observeValueForKeyPathメソッドが起動します。その方法では、ユーザーの場所を中心にマップの地域をリセットしています。

ユーザーが別の場所にパンまたはズームした後、別のユーザーの場所の変更が発生すると、そのメソッドが再度起動され、マップはユーザーの場所に戻ります。

あなたの場合の最も簡単な修正は、最初にユーザーの場所にズームした直後に観察を停止することです。observeValueForKeyPathメソッドの行の後に、setRegion次を追加します。

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


iOS 4.0 以降では、ユーザーの場所の変更を監視するために KVO (addObserver のすべてのもの) を使用する必要がないことに注意してください。didUpdateUserLocation代わりに、デリゲート メソッドを使用できます。

iOS 5.0 以降、ユーザーの場所にズームする別のオプションは、マップ ビューuserTrackingModeMKUserTrackingModeFollowまたはに設定することMKUserTrackingModeFollowWithHeadingです。この方法では、地域を手動で設定する必要はありません。マップはユーザーにズームして追従しますが、ユーザーは自由にパンまたはズームできます。

于 2012-09-01T01:45:52.170 に答える