如何在Swift 2中创建图像叠加并添加到MKMapView?

时间:2016-01-18 14:47:56

标签: ios swift image mapkit mkoverlay

我正在尝试学习MapKit,现在我正在尝试添加图像(不是多边形,圆形,矩形等)作为地图视图的叠加层。我似乎无法找到任何示例代码来帮助解释如何执行此操作。

到目前为止,我在ViewController.swift中的代码是:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    @IBOutlet var mapView: MKMapView!

    var locationManager: CLLocationManager!
    var mapOverlay: MKOverlay!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Setup our Location Manager
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()

        //Setup our Map View
        mapView.delegate = self
        mapView.mapType = MKMapType.Satellite
        mapView.showsUserLocation = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

我知道我需要使用:

func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer

和drawMapRect函数,但我不知道要放入哪些内容。此外,如果所有代码都在ViewController.swift

中,那将非常有用

我只需要一个叠加层,所以我不需要上课。我需要它是一个图像叠加(所以它可以调整大小),而不是一个注释。我也尝试按照http://www.raywenderlich.com/30001/overlay-images-and-overlay-views-with-mapkit-tutorial上的教程进行操作,但是没有包含所有代码的部分,我发现很难跟进。你们有没有人可以帮助我如何创建图像 MKOverlays并将它们添加到MKMapKit?

提前致谢...

2 个答案:

答案 0 :(得分:4)

Swift 3

以下内容适用于Swift 3。

class ImageOverlay : NSObject, MKOverlay {

    let image:UIImage
    let boundingMapRect: MKMapRect
    let coordinate:CLLocationCoordinate2D

    init(image: UIImage, rect: MKMapRect) {
        self.image = image
        self.boundingMapRect = rect
        self.coordinate = rect.centerCoordinate
    }
}

class ImageOverlayRenderer : MKOverlayRenderer {

    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {

        guard let overlay = self.overlay as? ImageOverlay else {
            return
        }

        let rect = self.rect(for: overlay.boundingMapRect) 

        UIGraphicsPushContext(context)
        overlay.image.draw(in: rect)
        UIGraphicsPopContext()
    }
}

然后像往常一样,在MapView委托中:

func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

    if overlay is ImageOverlay {
        return ImageOverlayRenderer(overlay: overlay)
    }
    ...
}

每当您需要向地图添加图片时:

let overlay = ImageOverlay(image: myImage, rect: desiredLocationAsMapRect)
mapView.add(overlay)

注意,我始终确保rect具有与图像相同的纵横比。否则,我怀疑会导致图像失真。

答案 1 :(得分:1)

Apple确实有一些sample code for displaying overlays,但它在Objective-C中,所以你必须将它转换为Swift。

基本上你需要做两件事(两者都可以在你的视图控制器中完成)。第一种是创建叠加层并将其添加到地图中,即viewDidLoad()中的某处:

    var points = [CLLocationCoordinate2D(latitude: -29.8122, longitude: 148.6351),
                  CLLocationCoordinate2D(latitude: -27.9307, longitude: 148.6351),
                  CLLocationCoordinate2D(latitude: -27.9307, longitude: 150.9909),
                  CLLocationCoordinate2D(latitude: -29.8122, longitude: 150.9909)]
    let tile = MKPolygon(coordinates: &points, count: points.count)
    tile.title = "Moree"
    mapView.addOverlay(tile)

请注意points必须是var,因为您要为平铺创建取消引用它。

然后第二步是定义渲染器:

// mapView delegate function
  func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {

    if overlay.isKindOfClass(MKPolygon) {
      let renderer = MKPolygonRenderer(overlay: overlay)

      renderer.fillColor = UIColor.cyanColor().colorWithAlphaComponent(0.2)
      renderer.strokeColor = UIColor.blueColor().colorWithAlphaComponent(0.7)
      renderer.lineWidth = 3
      return renderer
    }
    fatalError()
  }

使用Swift 2.1 / Xcode 7.2,这会在澳大利亚的某个位置为我渲染一块瓷砖。因此,您可能需要调整lat / lons以在地图中为您提供叠加层 - 地图默认值为您的大陆。