Настройка масштаба на MKMapView
У меня есть карта, которая показывает правильно, единственное, что я хочу сделать сейчас, это установить уровень масштабирования при загрузке. Есть ли способ сделать это?
спасибо
11 ответов:
Я нашел себе решение, которое очень удобно и делает трюк. Используйте
MKCoordinateRegionMakeWithDistance
для того, чтобы установить расстояние в метрах по вертикали и горизонтали, чтобы получить нужный масштаб. И тогда, конечно, при обновлении вашего местоположения вы получите правильные координаты, или вы можете указать его непосредственно вCLLocationCoordinate2D
при запуске, если это то, что вам нужно сделать:CLLocationCoordinate2D noLocation; MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500); MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion]; [self.mapView setRegion:adjustedRegion animated:YES]; self.mapView.showsUserLocation = YES;
основываясь на том, что линии долготы расположены одинаково в любой точке карты, существует очень простая реализация для установки centerCoordinate и zoomLevel:
@interface MKMapView (ZoomLevel) @property (assign, nonatomic) NSUInteger zoomLevel; - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated; @end @implementation MKMapView (ZoomLevel) - (void)setZoomLevel:(NSUInteger)zoomLevel { [self setCenterCoordinate:self.centerCoordinate zoomLevel:zoomLevel animated:NO]; } - (NSUInteger)zoomLevel { return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1; } - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; } @end
он не встроен, но я видел / использовал этой код. Это позволяет вам использовать это:
[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
Примечание: это не мой код, я его не писал, поэтому поэтому не могу взять на себя ответственность за него
вы также можете увеличить с помощью MKCoordinateRegion и установить его диапазон широты и долготы дельты. Ниже приведена краткая справка и здесь ссылка на iOS. Он не будет делать ничего необычного, но должен позволить вам установить масштаб, когда он рисует карту.
MKCoordinateRegion region; region.center.latitude = {desired lat}; region.center.longitude = {desired lng}; region.span.latitudeDelta = 1; region.span.longitudeDelta = 1; mapView.region = region;
редактировать 1:
MKCoordinateRegion region; region.center.latitude = {desired lat}; region.center.longitude = {desired lng}; region.span.latitudeDelta = 1; region.span.longitudeDelta = 1; region = [mapView regionThatFits:region]; [mapView setRegion:region animated:TRUE];
простая быстрая реализация, если вы используете розетки.
@IBOutlet weak var mapView: MKMapView! { didSet { let noLocation = CLLocationCoordinate2D() let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500) self.mapView.setRegion(viewRegion, animated: false) } }
на основе ответа @Carnal.
быстрая реализация
import Foundation import MapKit class MapViewWithZoom: MKMapView { var zoomLevel: Int { get { return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1); } set (newZoomLevel){ setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false) } } private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool){ let span = MKCoordinateSpanMake(0, 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256) setRegion(MKCoordinateRegionMake(coordinate, span), animated: animated) } }
на Swift 3 это довольно быстро вперед:
private func setMapRegion(for location: CLLocationCoordinate2D, animated: Bool) { let viewRegion = MKCoordinateRegionMakeWithDistance(location, <#T##latitudinalMeters: CLLocationDistance##CLLocationDistance#>, <#T##longitudinalMeters: CLLocationDistance##CLLocationDistance#>) MapView.setRegion(viewRegion, animated: animated) }
просто определите lat -, long-Meters
<CLLocationDistance>
и mapView будет соответствовать уровню масштабирования для ваших значений.
на основе @ Adilsoomro's great ответ. Я придумал вот что:
@interface MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated; -(double) getZoomLevel; @end @implementation MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; } -(double) getZoomLevel { return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)); } @end
Я надеюсь, что следующий фрагмент кода поможет вам.
- (void)handleZoomOutAction:(id)sender { MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.s pan.latitudeDelta/0.5, mapView.region.span.longitudeDelta/0.5)); [mapView setRegion:newRegion]; } - (void)handleZoomInAction:(id)sender { MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.span.latitudeDelta*0.5, mapView.region.span.longitudeDelta*0.5)); [mapView setRegion:newRegion]; }
вы можете выбрать любое значение вместо 0.5, чтобы уменьшить или увеличить масштаб. Я использовал эти методы по щелчку двух кнопок.
Я знаю, что это поздний ответ, но я просто хотел решить проблему настройка уровня увеличения себя. ответ goldmine отличный, но я обнаружил, что он недостаточно хорошо работает в моем приложении.
при ближайшем рассмотрении goldmine заявляет, что"линии долготы расположены одинаково в любой точке карты". Это не так, это на самом деле широтные линии, которые расположены одинаково от -90 (Южный полюс) до +90 (Северный полюс). Линии долготы расположены на самом широком расстоянии друг от друга. экватор, сходящийся к точке на полюсах.
реализация, которую я принял, поэтому использовать вычисление широты следующим образом:
@implementation MKMapView (ZoomLevel) - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate zoomLevel:(NSUInteger)zoom animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(180 / pow(2, zoom) * self.frame.size.height / 256, 0); [self setRegion:MKCoordinateRegionMake(coordinate, span) animated:animated]; } @end
надеюсь, что это поможет на этой поздней стадии.
ответ Swift 2.0 с использованием NSUserDefaults для сохранения и восстановления масштаба и положения карты.
функция сохранения положения карты и масштабирования:
func saveMapRegion() { let mapRegion = [ "latitude" : mapView.region.center.latitude, "longitude" : mapView.region.center.longitude, "latitudeDelta" : mapView.region.span.latitudeDelta, "longitudeDelta" : mapView.region.span.longitudeDelta ] NSUserDefaults.standardUserDefaults().setObject(mapRegion, forKey: "mapRegion") }
запускайте функцию при каждом перемещении карты:
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) { saveMapRegion(); }
функция сохранения масштаба и положения карты:
func restoreMapRegion() { if let mapRegion = NSUserDefaults.standardUserDefaults().objectForKey("mapRegion") { let longitude = mapRegion["longitude"] as! CLLocationDegrees let latitude = mapRegion["latitude"] as! CLLocationDegrees let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) let longitudeDelta = mapRegion["latitudeDelta"] as! CLLocationDegrees let latitudeDelta = mapRegion["longitudeDelta"] as! CLLocationDegrees let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta) let savedRegion = MKCoordinateRegion(center: center, span: span) self.mapView.setRegion(savedRegion, animated: false) } }
добавьте это в viewDidLoad:
restoreMapRegion()