Я хочу знать текущий уровень масштабирования MKMapView
в программировании на iphone, как я могу это сделать?
На самом деле у меня есть одно приложение, которое принимает несколько аргументов (Радиус от центра до угла MKMapView
) возвращает данные о магазине в том, что, когда я нахожусь на MKMapView
, радиус очень высокий, и он изменяется, когда Radius меньше, поэтому я хочу знать уровень масштабирования и настроить свой веб-сервис в соответствии с этим. Как я могу получить уровень масштабирования текущей видимой области MKMapView
?
Как найти текущий уровень масштабирования MKMapView?
Ответ 1
Вы можете использовать span
внутри свойства region
MKMapView
. Он определяется следующим образом:
typedef struct {
CLLocationDegrees latitudeDelta;
CLLocationDegrees longitudeDelta;
} MKCoordinateSpan;
Взгляните на documentation. Это хорошо объяснено там.
Ответ 2
Я создал для него очень простой вспомогательный подкласс:
#define MERCATOR_RADIUS 85445659.44705395
#define MAX_GOOGLE_LEVELS 20
@interface MKMapView (ZoomLevel)
- (double)getZoomLevel;
@end
@implementation MKMapView (ZoomLevel)
- (double)getZoomLevel
{
CLLocationDegrees longitudeDelta = self.region.span.longitudeDelta;
CGFloat mapWidthInPixels = self.bounds.size.width;
double zoomScale = longitudeDelta * MERCATOR_RADIUS * M_PI / (180.0 * mapWidthInPixels);
double zoomer = MAX_GOOGLE_LEVELS - log2( zoomScale );
if ( zoomer < 0 ) zoomer = 0;
// zoomer = round(zoomer);
return zoomer;
}
@end
Ответ 3
Самый простой способ получить Integer текущего уровня масштабирования - это использовать функцию MapView: regionDidChangeAnimated. Эта функция распознает каждое изменение масштаба и даст вам основание для вычисления коэффициента масштабирования.
Просто вставьте эту функцию в свой класс MapView (работает для Swift 3.0):
var mapView: MKMapView! = nil
...
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
let zoomWidth = mapView.visibleMapRect.size.width
let zoomFactor = Int(log2(zoomWidth)) - 9
print("...REGION DID CHANGE: ZOOM FACTOR \(zoomFactor)")
}
И вы получите из него значение zoomFactor, где 0 - самая близкая точка, которую вы можете увеличить на карте, и каждое более высокое значение - это далекое расстояние...: -)
Ответ 4
Все предыдущие ответы не учитывают текущее вращение карты. MKMapView longitudeDelta отличается для невращающейся карты и повернутой карты. Вот большая функция для вычисления прямого масштабирования карты: fooobar.com/questions/65310/...
И вот мое улучшение в Swift, которое учитывает поворот карты и возвращает текущий уровень масштабирования:
class MyMapView : MKMapView {
func getZoom() -> Double {
// function returns current zoom of the map
var angleCamera = self.camera.heading
if angleCamera > 270 {
angleCamera = 360 - angleCamera
} else if angleCamera > 90 {
angleCamera = fabs(angleCamera - 180)
}
let angleRad = M_PI * angleCamera / 180 // camera heading in radians
let width = Double(self.frame.size.width)
let height = Double(self.frame.size.height)
let heightOffset : Double = 20 // the offset (status bar height) which is taken by MapKit into consideration to calculate visible area height
// calculating Longitude span corresponding to normal (non-rotated) width
let spanStraight = width * self.region.span.longitudeDelta / (width * cos(angleRad) + (height - heightOffset) * sin(angleRad))
return log2(360 * ((width / 256) / spanStraight)) + 1;
}
}
Вы можете загрузить образец проекта в моем репо: https://github.com/d-babych/mapkit-wrap
Ответ 5
Если это помогает, вы также можете использовать mapView.camera.altitude
чтобы получить текущую высоту отображаемой в данный момент области карты.