Eigentlich ist da langsam Code, keithbhunter ist neben der Region schneller zu aktualisieren, als sie es laden kann, wird die Karte auch Höhe zu verändern, die zusätzlichen Aufwand verursacht!
Ich habe den Code aktualisiert, so dass es reibungslos läuft.
Mit diesem Code halte ich die Kartenansicht auf der gleichen Größe, aber stattdessen verschiebe ich den Punkt der Mitte, um die Höhe der Schiebeansicht zu kompensieren.
Damit dieser Code funktioniert, müssen Sie die Einstellung von keithbhunter so ändern, dass die bottom-Constraint der mapView vollständig an die Unterseite der Superview angeheftet ist (und nicht an slidingView (so dass die mapView immer die gleiche Größe wie die Super View hat) das Setup. Für den Rest ist das gleiche.
auch ist es möglich, die Menge des Zooms mit der variablen maxMetersDistance
Hier bin ich, immer zentriert auf dem Eifelturm
anpassen
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;
}
}
haben Sie 'setCenterCoordinate' Ansatz versucht? –
Soll die Karte beim Verschieben des Overlays vergrößert und verkleinert werden? – keithbhunter
@keithbhunter Ja, nach innen, wie Sie nach oben und außen schwenken, wie Sie nach unten schwenken .. – Aodh