#iphone
#iPhone
Вопрос:
Я создал карту, чтобы показать местоположение пользователя с автоматическим увеличением масштаба, однако, когда пользователь пытается уменьшить масштаб, он автоматически увеличивает масштаб, что непрактично, можете ли вы помочь мне отключить автоматическое увеличение при уменьшении масштаба пользователя?. Вот часть моего кода :
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
// store new user location
location = newLocation.coordinate;
//move the map to the new user location
MKCoordinateRegion region;
region.center = location;
// zoom level
MKCoordinateSpan span;
span.latitudeDelta = .005;
span.longitudeDelta = .005;
region.span = span;
// apply new coordinates
[mapView setRegion:region animated:TRUE];
}
Отредактировано:
Я добавил это утверждение в viewDidLoad:
mapView.zoomEnabled=FALSE;
следует ли отключать автоматическое увеличение при уменьшении масштаба пользователя?
- (void)viewDidLoad {
[super viewDidLoad];
//
// On veut afficher la position courante de l'utilisateur
[mapView setShowsUserLocation:TRUE];
// MKMapTypeStandard est un mode d'affichage parmis 3 disponibles
// (les deux autres sont MKMapTypeSatelitte et MKMapTypeHybrid et MKMapTypeStandard)
[mapView setMapType:MKMapTypeHybrid];
// Le fait de setter le Delegate permet d'appeler méthodes implémentées dans cette classe
[mapView setDelegate:self];
// On ajoute la View du mapView a la View du controlleur courant afin de faire afficher la carte
[self.view insertSubview:mapView atIndex:0];
// CLLocationManager permet la gestion de la position géographique de l'utilisateur
CLLocationManager *locationManager=[[CLLocationManager alloc] init];
// Le fait de setter le Delegate permet d'appeler méthodes implémentées dans cette classe
[locationManager setDelegate:self];
// Définit l'échelle de distance à prendre en compte pour le raffraichissement de la position courante
[locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters];
[locationManager startUpdatingLocation];
mapView.zoomEnabled=FALSE;
}
Редактировать:
Я все еще работаю над этим, поэтому, прежде чем продолжить, я хочу показать вам свою логику и жду ваших советов 🙂
Итак, на мой взгляд, которому поручено показывать местоположение пользователя на карте, добавлены логические переменные, чтобы проверить, отрегулировал ли пользователь масштаб или нет.
.h
BOOL shouldAdjustZoom;
и для методов :
-(void)zoomLevelForMapRect:(MKMapRect)mRect withMapViewSizeInPixels:(CGSize)viewSizeInPixels;
-(void)setShouldAdjustZoom:(BOOL)shouldAdjZoom;
-(BOOL)shouldAdjustZoom;
.m
Я добавил реализацию средства получения, -(BOOL)shouldAdjustZoom
поэтому это средство получения вызовет zoomLevelForMapRect
, чтобы узнать, был ли изменен уровень увеличения или нет.
-(BOOL)shouldAdjustZoom
{
[self zoomLevelForMapRect];
return shouldAdjustZoom;
}
-(void)zoomLevelForMapRect:(MKMapRect)mRect withMapViewSizeInPixels:(CGSize)viewSizeInPixels {
NSUInteger zoomLevel=20;
MKZoomScale zoomScale=mRect.size.width/viewSizeInPixels.width;
double zoomExponent=log2(zoomScale);
zoomLevel=(NSUInteger)(20-ceil(zoomExponent));
if(zoomLevel<20)
{
[self setShouldAdjustZoom:NO];
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
location = newLocation.coordinate;
MKCoordinateRegion region;
region.center = location;
if ([self shouldAdjustZoom]==YES) {
// Use the manually defined span
MKCoordinateSpan span;
span.latitudeDelta = .005;
span.longitudeDelta = .005;
region.span = span;
} else {
// Keep the current span
MKCoordinateRegion mapRegion = mapView.region; // To get the current span
mapRegion.center = newLocation.coordinate;
mapView.region = mapRegion;
}
MKCoordinateSpan span;
span.latitudeDelta = .005;
span.longitudeDelta = .005;
region.span = span;
[mapView setRegion:region animated:TRUE];
}
Что мне нужно знать, так это как я должен вызывать zoomLevelForMapRect
метод, он с параметрами, в получателе, который мне нужно вызвать :
-(BOOL)shouldAdjustZoom
{
[self zoomLevelForMapRect];//how should I fix the call??
return shouldAdjustZoom;
}
Ответ №1:
Такого понятия, как автоматическое увеличение, не существует. Уровень масштабирования устанавливается вручную, определяя диапазон, как вы это сделали:
span.latitudeDelta = .005;
span.longitudeDelta = .005;
При ручной настройке диапазона всегда будет отображаться фиксированный уровень масштабирования.
Если вы хотите сохранить текущий уровень увеличения, сделайте это:
MKCoordinateRegion mapRegion = mapView.region; // To get the current span
mapRegion.center = newLocation.coordinate;
mapView.region = mapRegion;
Рассмотрите возможность использования флага для чередования желаемого поведения.
Т.е.
при установке viewDidLoad _shouldAdjustZoom = YES;
Затем, когда пользователь настраивает набор масштабирования _shouldAdjustZoom = NO;
(существует метод делегирования вида карты, вызываемый при изменении пользователем масштаба)
(void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
if (_shouldAdjustZoom) {
// Use the manually defined span
} else {
// Keep the current span
}
}
Комментарии:
1. Привет, большое спасибо за ваше объяснение, вопрос, что вы подразумеваете под «Рассмотрите возможность использования флага для чередования желаемого поведения». ??спасибо
2. предполагается, что переменные lat и lon содержат значение откуда??
3. Привет, Роберт, большое спасибо за твои объяснения, у меня вопрос, ты сказал, что есть метод делегирования просмотра карты, вызываемый, когда пользователь изменяет масштаб, что мне нужно знать, вызывается ли он автоматически?? и как оно называется ?? спасибо