我正在尝试学习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?
提前致谢...
答案 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以在地图中为您提供叠加层 - 地图默认值为您的大陆。