如何使用框架库中的 MapView Xcode8
how to use MapView from a framework library Xcode8
我创建了一个自定义图块服务并将其添加到 mapView 然后它工作正常。然后我使用相同的代码并在 Xcode 8 中使用 MapView return 类型创建了一个框架库。然后我使用了一个示例测试应用程序并将该库导入它,我调用了库中使用的方法和将其添加到地图视图。 所以我的问题是当我调用 mapView 的方法时它显示 MapKit 地图而不是我的自定义地图
库中使用的代码
import Foundation
import MapKit
public class mapLib: NSObject{
public class func createMap(mapView: MKMapView) ->MKMapView{
let mapView = mapView
//custom map URL
let template = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: template)
overlay.canReplaceMapContent = true
mapView.add(overlay, level: .aboveLabels)
return mapView;
}
}
应用中使用的代码
import UIKit
import MapKit
import mapLib
class ViewController: UIViewController {
@IBOutlet weak var mapV: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
let view = mapLib.createMap(mapView: mapV)
mapV.addOverlays(view.overlays)
//any additional setup after loading the view, typically from a nib.
}
我需要澄清一下,我将要采用的方法或任何其他方法都可行:)
您缺少将 self
添加为 delegate
并实现 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
方法,您可以在您的库中执行此操作
像这样
import Foundation
import MapKit
public class mapLib: NSObject{
public class func createMap(mapView: MKMapView) ->MKMapView{
let mapView = mapView
//custom map URL
let template = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: template)
overlay.canReplaceMapContent = true
mapView.add(overlay, level: .aboveLabels)
mapView.delegate = self
return mapView;
}
}
extension mapLib : MKMapViewDelegate{
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let overlayTile = overlay as? MKTileOverlay{
let overLayRenderer = MKTileOverlayRenderer(tileOverlay: overlayTile)
return overLayRenderer
}
return MKOverlayRenderer(overlay: overlay)
}
}
我创建了一个自定义图块服务并将其添加到 mapView 然后它工作正常。然后我使用相同的代码并在 Xcode 8 中使用 MapView return 类型创建了一个框架库。然后我使用了一个示例测试应用程序并将该库导入它,我调用了库中使用的方法和将其添加到地图视图。 所以我的问题是当我调用 mapView 的方法时它显示 MapKit 地图而不是我的自定义地图
库中使用的代码
import Foundation
import MapKit
public class mapLib: NSObject{
public class func createMap(mapView: MKMapView) ->MKMapView{
let mapView = mapView
//custom map URL
let template = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: template)
overlay.canReplaceMapContent = true
mapView.add(overlay, level: .aboveLabels)
return mapView;
}
}
应用中使用的代码
import UIKit
import MapKit
import mapLib
class ViewController: UIViewController {
@IBOutlet weak var mapV: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
let view = mapLib.createMap(mapView: mapV)
mapV.addOverlays(view.overlays)
//any additional setup after loading the view, typically from a nib.
}
我需要澄清一下,我将要采用的方法或任何其他方法都可行:)
您缺少将 self
添加为 delegate
并实现 func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
方法,您可以在您的库中执行此操作
像这样
import Foundation
import MapKit
public class mapLib: NSObject{
public class func createMap(mapView: MKMapView) ->MKMapView{
let mapView = mapView
//custom map URL
let template = "http://tile.openstreetmap.org/{z}/{x}/{y}.png"
let overlay = MKTileOverlay(urlTemplate: template)
overlay.canReplaceMapContent = true
mapView.add(overlay, level: .aboveLabels)
mapView.delegate = self
return mapView;
}
}
extension mapLib : MKMapViewDelegate{
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
if let overlayTile = overlay as? MKTileOverlay{
let overLayRenderer = MKTileOverlayRenderer(tileOverlay: overlayTile)
return overLayRenderer
}
return MKOverlayRenderer(overlay: overlay)
}
}