返回
写代码,不忘用户体验:Swift多地图源业务向地图控件实现(三)交互事件处理
IOS
2023-12-08 16:20:41
点拖动编辑功能
有的时候地图控件上还会有交互需求。比如在我的业务场景里,需要编辑无人机巡航的区域。要编辑区域,区域的多边形顶点就需要可以拖动。 简化一下需求,我们现在来实现一下点拖动编辑的功能。 上面要注意的细节是需要设置 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:)方法中,创建多边形渲染器并设置其颜色和宽度。这样,当多边形添加到地图上时,就可以看到它了。
通过以上步骤,我们就实现了点拖动编辑功能。