In realtà, il codice di keithbhunter è lento perché oltre l'aggiornamento della regione più velocemente di quanto si può caricarlo, la mappa sta cambiando anche in altezza che provoca spese extra!
Ho aggiornato il codice in modo che sia scorrevole.
Con questo codice, quello che faccio è mantenere la vista della mappa delle stesse dimensioni ma invece sposto il punto del centro per compensare l'altezza della vista scorrevole.
Per far funzionare questo codice, è necessario modificare l'impostazione di keithbhunter in modo che il vincolo di fondo di mapView sia completamente bloccato sul fondo della superview (e non su slidingView (in modo che mapView abbia sempre le stesse dimensioni della vista super) . per il resto l'impostazione è la stessa.

Inoltre è possibile personalizzare la quantità di zoom con la variabile maxMetersDistance
Qui sto, sempre al centro l'Eifel torre

import UIKit
import MapKit
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var slidingView: UIView!
@IBOutlet weak var slidingViewHeight: NSLayoutConstraint!
var maxMetersDistance:CGFloat = 10000.0; // customize this to set how far the map zooms out of the interest area
override func viewDidLoad() {
super.viewDidLoad()
let pan = UIPanGestureRecognizer(target: self, action: "viewDidPan:")
self.slidingView.addGestureRecognizer(pan)
firstTimeCenter()
}
func firstTimeCenter(){
var coordinate = CLLocationCoordinate2D(latitude: 48.8582, longitude: 2.2945)
let region = MKCoordinateRegionMakeWithDistance(coordinate, Double(maxMetersDistance), Double(maxMetersDistance))
self.mapView.setRegion(region, animated: true)
}
func reloadMap() {
let height = CGFloat(self.slidingViewHeight.constant)
var regionDistance = (maxMetersDistance/self.view.frame.height) * height
regionDistance = maxMetersDistance - regionDistance
var coordinate = CLLocationCoordinate2D(latitude: 48.8582, longitude: 2.2945)
var mapRect = mapView.visibleMapRect;
var metersPerMapPoint = MKMetersPerMapPointAtLatitude(coordinate.latitude);
var metersPerPixel = CGFloat(metersPerMapPoint) * CGFloat(mapRect.size.width)/CGFloat(mapView.bounds.size.width);
var totalMeters = Double(metersPerPixel) * Double(height/2)
coordinate = self.translateCoord(coordinate, MetersLat: -totalMeters, MetersLong: 0.0)
let region = MKCoordinateRegionMakeWithDistance(coordinate, Double(regionDistance), Double(regionDistance))
self.mapView.setRegion(region, animated: false)
}
func viewDidPan(panGesture: UIPanGestureRecognizer) {
let location = panGesture.locationInView(self.view)
self.slidingViewHeight.constant = self.view.frame.size.height - location.y
self.reloadMap()
}
func translateCoord(coord:CLLocationCoordinate2D, MetersLat:Double, MetersLong:Double)->CLLocationCoordinate2D{
var tempCoord = CLLocationCoordinate2D()
var tempRegion = MKCoordinateRegionMakeWithDistance(coord, MetersLat, MetersLong);
var tempSpan = tempRegion.span;
tempCoord.latitude = coord.latitude + tempSpan.latitudeDelta;
tempCoord.longitude = coord.longitude + tempSpan.longitudeDelta;
return tempCoord;
}
}
fonte
2015-06-19 13:50:57
Hai provato 'approccio setCenterCoordinate'? –
La mappa deve essere ingrandita e rimpicciolita quando si esegue la panoramica dell'overlay? – keithbhunter
@keithbhunter Sì, verso l'interno mentre scorri verso l'alto e verso l'esterno mentre scorri verso il basso .. – Aodh