Возвращение предыдущей координаты 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;
}
Выше код взят из этого ответа