Возвращение предыдущей координаты MKPinAnnotation из MKMapSnapShot

У меня есть два контроллера вида, MapViewVC а также MapDetailViewVC,

У меня есть несколько пользовательских аннотаций MapView,

При нажатии эти аннотации (с определенным видом по умолчанию "высота") инициируют MapDetailVC это показывает снимок аннотации со свойством камеры, установленной на определенную высоту (4000 м).

В результате, когда кнопка "назад" нажата на MapDetailVC, вид восходит к MapViewVC с той же высотой, как было представлено в MapDetailVC; не до первоначальной высоты, которая была просто областью, просматриваемой во время нажатия кнопки выноски.

Я хочу знать (из более опытных MapKit) если есть способ установить mapView вернуться к исходной настройке при нажатии кнопки "назад".

Спасибо

MapDetailViewController *mapDetail = [[self storyboard]
instantiateViewControllerWithIdentifier:@"MapDetailViewController"];

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Map"
                                                               style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;

Word *word = [[Word alloc] init];
word.name = biblicalPin.title;


MKMapCamera  *myCamera = [MKMapCamera
                          cameraLookingAtCenterCoordinate:biblicalPin.coordinate
                          fromEyeCoordinate:biblicalPin.coordinate
                          eyeAltitude:2000];

mapView.camera = myCamera;


MKMapSnapshotOptions *options = [[MKMapSnapshotOptions alloc] init];
options.size = CGSizeMake(320, 140);
options.camera = myCamera;
options.scale = [[UIScreen mainScreen] scale]; 
options.region = self.mapView.region;
options.mapType = MKMapTypeSatellite;

MKMapSnapshotter *snapshotter =
[[MKMapSnapshotter alloc] initWithOptions:options];
[snapshotter startWithCompletionHandler:^(MKMapSnapshot *snapshot, NSError *e)
 {
 //if (e) ...;// Handle errors

 UIImage *image = snapshot.image;

 mapDetail.imageView.image = image;
 mapDetail.currentWordDetail = word;
 mapDetail.locationLabel.text = biblicalPin.title;
 mapDetail.locationDescription.text = biblicalPin.information;
 //[backButton --- add a method to return the user to the original mapView alititude.

 }];

word.definition = biblicalPin.information;

[self.navigationController pushViewController:mapDetail animated:YES];

1 ответ

Одним из способов сброса карты является вызов метода делегата при нажатии кнопки назад.

Создать метод делегата в MapDetailVC лайк:

@protocol MapDetailDelegate <NSObject>

- (void) resetMapView;

@end

@interface MapDetailVC : UIViewController

@property (nonatomic, weak) id <MapDetailDelegate>    delegate;

@end

Сделайте делегирование себя, когда вы создаете объект контроллера представления в MapViewVC Контроллер класса. Также продлить продлить MapViewVC интерфейс класса с делегатом <MapDetailDelegate>

MapDetailViewController *mapDetail = [[self storyboard]
instantiateViewControllerWithIdentifier:@"MapDetailViewController"];
mapDetail.delegate = self;

Создать метод -resetMapView() в MapViewVC учебный класс.

- (void) resetMapView {
    // Reset map. Default settings.

    // Reset map to user current location.
    [UIView animateWithDuration:1.5 animations:^{

        [self.mapView setCenterCoordinate:self.mapView.userLocation.coordinate];

    } completion:^(BOOL finished) {
        [UIView animateWithDuration:1.5 animations:^{
            MKCoordinateSpan span;
            span.latitudeDelta  = 1;
            span.longitudeDelta = 1;

            MKCoordinateRegion region;
            region.span = span;
            region.center = self.mapView.userLocation.coordinate;
            [self.mapView setRegion:region animated:YES];
        }];
    }];
}

Теперь, когда нажата кнопка "Назад", вызовите этот метод из MapDetailVC класс контроллера с использованием delegate объект.

- (void) backButtonTapped:(id)sender {
    [self.delegate resetMapView];

    [self.navigationController popViewControllerAnimated:YES];
}

Редактировать:

Поток для карты сброса здесь будет таким же, как вам нужно. Теперь вместо получения местоположения пользователя вы можете вызвать метод ниже -resetMapView() загрузить масштаб камеры по умолчанию.

-(CLLocationCoordinate2D)translateCoord:(CLLocationCoordinate2D)coord MetersLat:(double)metersLat MetersLong:(double)metersLong{

    CLLocationCoordinate2D tempCoord;

    MKCoordinateRegion tempRegion = MKCoordinateRegionMakeWithDistance(coord, metersLat, metersLong);
    MKCoordinateSpan tempSpan = tempRegion.span;

    tempCoord.latitude = coord.latitude + tempSpan.latitudeDelta;
    tempCoord.longitude = coord.longitude + tempSpan.longitudeDelta;

    return tempCoord;    
}

Выше код взят из этого ответа

Другие вопросы по тегам