在屏幕外渲染MKMapView

时间:2017-04-06 03:48:41

标签: swift mkmapview ios10 mkmapviewdelegate

我正在尝试将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)

我还实施了MKMapKitDelegate的方法mapViewDidFinishLoadingMap()。此方法永远不会被调用,除非我将地图添加到视图层次结构使其可见。这意味着将其alpha设置为0或isHidden设置为true不起作用(在这种情况下,地图不会加载)。帮助

3 个答案:

答案 0 :(得分:0)

你能说出你想隐藏的内容吗?如果您的图像不可见,则地图将不会加载数据,这也就是为什么不调用其委托,因为苹果文档中也提到了这一点,请参阅下面的说明。它表示在你的情况下加载当前请求时会调用它我认为地图是不可见的,所以它的请求没有被加载,当你看到它时,请求被加载,因此你可以看到。

  

当加载了与当前请求关联的地图图块时,将调用此方法。当新的可见区域滚动到视图中并且图块尚不可用时,将请求地图图块。对于当前不可见的地图部分,也可以请求地图图块。例如,地图视图可以根据需要加载紧邻当前可见区域的图块,以便用户处理小平底锅。

     

https://developer.apple.com/reference/mapkit/mkmapviewdelegate/1452291-mapviewdidfinishloadingmap

答案 1 :(得分:0)

显然,MKMapView只会加载地图的可见图块,因此您要离线渲染的mapView必须“可见”。
据我所知,如果设置了window属性,则视图是“可见的”,即不是nil(请参阅progrmr的回答here)。 /> 因此,可能需要设置以UIWindow作为根视图的其他mapView。在这种情况下,window的{​​{1}}属性已设置,我相信mapView会加载所需的图块,以便可以呈现,即使附加mapView不可见 这显然是由UIWindow完成的,请参阅上面链接中pageViewController的评论。

答案 2 :(得分:0)

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

  1. 实施MKMapViewDelegate方法mapViewDidFinishRenderingMap(_ mapView:, fullyRendered:)。请务必使用此方法代替mapViewDidFinishLoadingMap(_ mapView:)

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

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