在屏幕外渲染MKMapView

Mac*_*tle 9 mkmapview mkmapviewdelegate swift ios10

我试图渲染MKMapView成一个UIImage,而不是在屏幕上显示它.我初始化地图:

let mapView = MKMapView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000))
mapView.delegate = self

let region = MKCoordinateRegionMakeWithDistance(location.coordinate(), 1000, 1000)
mapView.setRegion(region, animated: false)
Run Code Online (Sandbox Code Playgroud)

我也实现了MKMapKitDelegate这个方法mapViewDidFinishLoadingMap().除非我将地图添加到视图层次结构使其可见,否则永远不会调用此方法.这意味着,其设置alpha为0,或isHiddentrue不工作(在地图中没有加载在这种情况下).救命?

Mac*_*tle 1

好的,这是我自己的解决方案。

  1. 实施该MKMapViewDelegate方法mapViewDidFinishRenderingMap(_ mapView:, fullyRendered:)。请务必使用此方法而不是mapViewDidFinishLoadingMap(_ mapView:)

  2. 这是古怪的部分。将地图视图添加到现有的可见视图(我使用视图控制器自己的视图),并将其放置在屏幕外,仅显示一个像素。这很重要,因为如果地图没有可见像素,它将不会渲染。例如:

    let width = 1000
    let height = 1000
    
    let mapView = MKMapView(frame: CGRect(x: -width+1, y: -height+1, width: width, height: height))
    view.addSubview(mapView)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 没有步骤 3。如果正确配置地图,(1) 中提到的委托方法将被调用,此时您将获得完全渲染的地图。