如何在地图上垂直移动(通过Pan Gesture)另一个视图,使引脚保持在叠加层上方(而不是实际的MapKit叠加层),如何将引脚置于地图中心。
请参阅附件截图,了解第一个和最终状态。
当用户平移上/下时,我已经获得了叠加层和屏幕顶部之间空间的CGRect。然而,当用户向上移动时,我如何使用它来移动地图和图钉同时放大地图......当用户向下移动时再次缩小,到目前为止我没有找到它。
我尝试过不同的方法,从尝试调整可见矩形到调整地图视图的框架。答案可能在于一些MKMapRect / Region技巧..
(Freepik CC BY 3.0手形图标)
答案 0 :(得分:5)
实际上,keithbhunter的代码很慢,因为除了更快地更新区域之外,地图也会改变高度,这会导致额外的开销!
我更新了代码,使其顺利运行。
使用此代码,我所做的是保持地图视图的大小相同,但我移动中心点以补偿滑动视图的高度。
要使此代码生效,您必须修改keithbhunter的设置,以便mapView的底部约束完全固定到superview的底部(而不是pullView的底部(以便mapView的大小与超级视图的大小相同。其余的设置是相同的。
还可以使用变量maxMetersDistance
我总是以埃菲尔铁塔为中心
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;
}
}
答案 1 :(得分:4)
class ViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var slidingView: UIView!
@IBOutlet weak var slidingViewHeight: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.reloadMap()
let pan = UIPanGestureRecognizer(target: self, action: "viewDidPan:")
self.slidingView.addGestureRecognizer(pan)
}
func reloadMap() {
let coordinate = CLLocationCoordinate2D(latitude: 37.332363, longitude: -122.030805)
let height = Double(self.mapView.frame.size.height)
let regionDistance = 0.3 * height * height // random multiplier and exponential equation for scaling
let region = MKCoordinateRegionMakeWithDistance(coordinate, regionDistance, 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()
}
}
要设置视图,请在视图控制器中放置地图视图和UIView
。使用autolayout将地图视图的左侧,顶部和右侧固定到超级视图。然后将地图视图的底部固定到UIView
的顶部。接下来,将UIView
的左侧,底部和右侧固定到超视图。最后,在UIView
上设置一个高度约束,以便将其初始化为。当用户拖动视图时,将更改此高度值。这允许UIView
随意增长并同时安抚自动布局。
为视图控制器添加@IBOutlet
以获取地图视图,UIView
和UIView
的高度限制,如上面的代码所示。 regionDistance
属性正在这里进行缩放魔术。它是一个指数方程(我随机构成),它将根据地图视图的高度计算更大或更小的区域。 reloadMap()
使用它来更新地图的缩放。将所有内容绑在一起的是UIPanGestureRecognizer
上的UIView
,它控制着UIView
的高度,从而导致地图上的缩放操作。
陷阱:这会强制地图更快地更新区域,而不是加载区域,使其看起来非常有弹性。可能有办法解决这个问题。发挥创意。
我在示例中使用的坐标是Apple的总部。