2

プログラムでMKMap領域を再配置して、注釈(マップの読み込み時に自動的に選択される)がすべて中央に収まるようにする方法を見つけようとしています。

現在の結果:https ://www.evernote.com/shard/s46/sh/7c7d2ed8-203c-4878-af8c-83ff77ad7b21/ce7786acdf66b0782fc689b72d1b67e7

望ましい結果:https ://www.evernote.com/shard/s46/sh/21fb0eab-d5c4-4e6d-b05b-322e7dcce8ab/ab816f2a24f11b9c9e15bf55ac648f72

すべてを再配置しようとしまし- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)viewsたが、うまくいきませんでした。より良いアプローチはありますか?

//ここにviewWillAppearロジックがあります

[self.mapView removeAnnotations:self.mapView.annotations];

CLGeocoder *geocoder = [[CLGeocoder alloc] init];

CLGeocodeCompletionHandler completionHandler = ^(NSArray *placemarks, NSError *error) {

if (error) {

  EPBLog(@"error finding placemarks: %@", [error localizedDescription]);

} else {

  if (placemarks) {

    [placemarks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

      CLPlacemark *placemark = (CLPlacemark *)obj;

      if ([placemark.country isEqualToString:@"United States"]) {

        EPBAnnotation *annotation = [EPBAnnotation annotationWithCoordinate:placemark.location.coordinate];

        annotation.title    = self.locationObj.locationName;
        annotation.subtitle = self.locationObj.locationAddress;

        [self.mapView addAnnotation:annotation];

        self.mapView.selectedAnnotations = @[annotation];

        [self.mapView setCenterCoordinate:placemark.location.coordinate];

        /**
         * @todo
         * MOVE THIS OUTTA HERE
         */

        MKCoordinateRegion region = {{0.0f, 0.0f}, {0.0f, 0.0f}};

        region.center = placemark.location.coordinate;

        region.span.longitudeDelta = 0.003f;
        region.span.latitudeDelta  = 0.003f;

        [self.mapView setRegion:region animated:YES];
        [self.mapView regionThatFits:region];

        *stop = YES;
      }
    }];
  }
}
};

[geocoder geocodeAddressString:self.locationObj.locationAddress completionHandler:completionHandler];
4

1 に答える 1

6

次の方法は、すべての注釈を表示するために地域の地図に適合します。このメソッドは、MapのdidAddAnnotationsメソッドで呼び出すことができます。

- (void)zoomToFitMapAnnotations { 

    if ([mMapView.annotations count] == 0) return;
    int i = 0;
    MKMapPoint points[[mMapView.annotations count]];

    //build array of annotation points
    for (id<MKAnnotation> annotation in [mMapView annotations]){
         points[i++] = MKMapPointForCoordinate(annotation.coordinate);
    }

    MKPolygon *poly = [MKPolygon polygonWithPoints:points count:i];
    [mMapView setRegion:MKCoordinateRegionForMapRect([poly boundingMapRect]) animated:YES]; 
}

ただし、表示領域にもユーザーの場所の注釈を追加するかどうかを確認する必要があります。そうしない場合は、ループ内で現在の注釈がMkUserLocationであるかどうかを確認し、そのポイントをポイント配列に追加しないでください。

if ([annotation isKindOfClass:[MKUserLocation class]]) {
    continue:
}

ここで、注釈を中央に配置して自動的に選択する場合は、これを実行します

annotation.coordinate=mMapView.centerCoordinate;
[mMapView selectAnnotation:annotation animated:YES];
于 2012-11-26T15:19:03.013 に答える