返回

写代码,不忘用户体验:Swift多地图源业务向地图控件实现(三)交互事件处理

IOS

点拖动编辑功能

有的时候地图控件上还会有交互需求。比如在我的业务场景里,需要编辑无人机巡航的区域。要编辑区域,区域的多边形顶点就需要可以拖动。 简化一下需求,我们现在来实现一下点拖动编辑的功能。 上面要注意的细节是需要设置 isUserInteractionEnabled 为 true。 接着,我们可以使用 UIPanGestureRecognizer 来处理点拖动事件。代码如下:

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var points: [CGPoint] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.isUserInteractionEnabled = true
        mapView.delegate = self

        let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handlePanGesture(_:)))
        mapView.addGestureRecognizer(panGestureRecognizer)
    }

    @objc func handlePanGesture(_ gestureRecognizer: UIPanGestureRecognizer) {
        if gestureRecognizer.state == .began {
            // 开始拖动时,记录当前点的位置
            let point = gestureRecognizer.location(in: mapView)
            points.append(point)
        } else if gestureRecognizer.state == .changed {
            // 拖动时,更新当前点的位置
            let point = gestureRecognizer.location(in: mapView)
            points[points.count - 1] = point
            // 重新绘制多边形
            redrawPolyline()
        } else if gestureRecognizer.state == .ended {
            // 拖动结束时,添加新的点
            let point = gestureRecognizer.location(in: mapView)
            points.append(point)
            // 重新绘制多边形
            redrawPolyline()
        }
    }

    func redrawPolyline() {
        // 创建多边形
        let polyline = MKPolyline(points: points, count: points.count)
        // 添加多边形到地图上
        mapView.addOverlay(polyline)
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        // 创建多边形渲染器
        let polylineRenderer = MKPolylineRenderer(overlay: overlay)
        // 设置多边形渲染器的颜色
        polylineRenderer.strokeColor = .blue
        // 设置多边形渲染器的宽度
        polylineRenderer.lineWidth = 3
        // 返回多边形渲染器
        return polylineRenderer
    }
}

这段代码首先在viewDidLoad方法中设置了isUserInteractionEnabled属性为true,并添加了一个UIPanGestureRecognizer手势识别器到地图控件上。然后,在handlePanGesture方法中处理手势识别器事件。当手势识别器开始拖动时,记录当前点的位置;当手势识别器正在拖动时,更新当前点的位置;当手势识别器结束拖动时,添加新的点。最后,在redrawPolyline方法中重新绘制多边形。

在mapView(_:rendererFor:)方法中,创建多边形渲染器并设置其颜色和宽度。这样,当多边形添加到地图上时,就可以看到它了。

通过以上步骤,我们就实现了点拖动编辑功能。