Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在MKMapView中使pin和贴图在移动覆盖上方居中_Ios_Swift_Mapkit_Mkmaprect - Fatal编程技术网

Ios 如何在MKMapView中使pin和贴图在移动覆盖上方居中

Ios 如何在MKMapView中使pin和贴图在移动覆盖上方居中,ios,swift,mapkit,mkmaprect,Ios,Swift,Mapkit,Mkmaprect,当我在地图上垂直移动(通过平移手势)另一个视图时,如何保持图钉在地图上居中,从而使图钉保持在覆盖层(而不是实际的MapKit覆盖层)上方 有关第一个和最后一个状态,请参见所附的屏幕截图 当用户向上/向下平移时,我得到了覆盖层和屏幕顶部之间空间的CGRect。然而,当用户向上平移时,我如何在放大地图的同时移动地图和图钉,以及当用户向下平移时,如何再次缩小地图,到目前为止,我一直无法理解 我尝试了不同的方法,从尝试调整可见矩形到调整地图视图的框架。答案可能在于某些MKMapRect/区域欺骗 (

当我在地图上垂直移动(通过平移手势)另一个视图时,如何保持图钉在地图上居中,从而使图钉保持在覆盖层(而不是实际的MapKit覆盖层)上方

有关第一个和最后一个状态,请参见所附的屏幕截图

当用户向上/向下平移时,我得到了覆盖层和屏幕顶部之间空间的CGRect。然而,当用户向上平移时,我如何在放大地图的同时移动地图和图钉,以及当用户向下平移时,如何再次缩小地图,到目前为止,我一直无法理解

我尝试了不同的方法,从尝试调整可见矩形到调整地图视图的框架。答案可能在于某些MKMapRect/区域欺骗

(手形图标由3.0抄送)

要设置视图,请在视图控制器中放置地图视图和
UIView
。使用“自动布局”将地图视图的左侧、顶部和右侧固定到superview。然后将地图视图的底部固定到
ui视图的顶部。接下来,将
ui视图的左侧、底部和右侧固定到superview。最后,将
UIView
上的高度约束设置为您希望其初始化为的任何值。此高度值将在用户拖动视图时更改。这允许
UIView
随我们的喜好而增长,同时满足自动布局的需要

为地图视图、
UIView
UIView
的高度约束向视图控制器添加一个
@IBOutlet
,如上面的代码所示。
regionDistance
属性就是这里的变焦魔力所在。这是一个指数方程(我随机编出来的),它将根据地图视图的高度计算区域的大小
reloadMap()
使用此选项更新地图的缩放。将其连接在一起的是
ui视图
上的
ui感知识别器
,它控制
ui视图
的高度,从而导致地图上的缩放操作

陷阱:这迫使地图更新区域的速度超过加载区域的速度,使其看起来非常不稳定。也许有办法解决这个问题。发挥创造力

我在示例中使用的坐标是苹果总部


实际上,keithbhunter的代码很慢,因为除了更新区域的速度快于加载速度外,地图还改变了高度,这会导致额外的开销

我更新了代码,使其运行平稳

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

要使此代码正常工作,您必须修改keithbhunter的设置,以便将贴图视图的底部约束完全固定到superview的底部(而不是滑动视图(以便贴图视图始终与superview大小相同)。其余设置相同

还可以使用变量
maxMetersDistance

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


你试过
setCenterCoordinate
方法吗?当你平移叠加图时,地图应该放大和缩小吗?@keithbhunter是的,向上平移时向内,向下平移时向外……谢谢Juan&Keith!Juan的解决方案中有一些跳跃,我必须弄清楚,但这与我想要的非常接近:)
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()
    }

}
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;
    }

}