ios – 如何在MKMapView中将引脚和贴图保持在移动叠加层的中心

ios – 如何在MKMapView中将引脚和贴图保持在移动叠加层的中心,第1张

概述如何在地图上垂直移动(通过Pan Gesture)另一个视图,使得引脚保持在覆盖图上方(而不是实际的MapKit覆盖图),如何将引脚置于地图中心. 请参阅附加屏幕截图,了解第一个和最终状态. 当用户平移上/下时,我已经获得了叠加层和屏幕顶部之间空间的CGRect.然而,当用户向上平移时,我如何使用它来移动地图和图钉同时放大地图……当用户向下平移时再次缩小,到目前为止我已经躲过了. 我尝试过不同的方 如何在地图上垂直移动(通过Pan Gesture)另一个视图,使得引脚保持在覆盖图上方(而不是实际的MapKit覆盖图),如何将引脚置于地图中心.

请参阅附加屏幕截图,了解第一个和最终状态.

当用户平移上/下时,我已经获得了叠加层和屏幕顶部之间空间的CGRect.然而,当用户向上平移时,我如何使用它来移动地图和图钉同时放大地图……当用户向下平移时再次缩小,到目前为止我已经躲过了.

我尝试过不同的方法,从尝试调整可见矩形到调整地图视图的框架.答案可能在于一些MKMapRect / Region技巧.

(Freepik CC BY 3.0手形图标)

解决方法 实际上,keithbhunter的代码很慢,因为除了更快地更新区域之外,地图也会改变高度,这会导致额外的开销!

我更新了代码,使其顺利运行.

使用此代码,我所做的是保持地图视图的大小相同,但我移动中心点以补偿滑动视图的高度.

要使此代码生效,您必须修改keithbhunter的设置,以便mapVIEw的底部约束完全固定到supervIEw的底部(而不是pullVIEw(以便mapVIEw始终与超级视图的大小相同).设置是一样的.

此外,还可以使用变量maxMetersdistance自定义缩放量

在这里,我总是以埃菲尔铁塔为中心

import UIKitimport MapKitclass 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;    }}
总结

以上是内存溢出为你收集整理的ios – 如何在MKMapView中将引脚和贴图保持在移动叠加层的中心全部内容,希望文章能够帮你解决ios – 如何在MKMapView中将引脚和贴图保持在移动叠加层的中心所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1094964.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存