我正在尝试将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
不起作用(在这种情况下,地图不会加载)。帮助
答案 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)
好的,这是我自己的解决方案。
实施MKMapViewDelegate
方法mapViewDidFinishRenderingMap(_ mapView:, fullyRendered:)
。请务必使用此方法代替mapViewDidFinishLoadingMap(_ mapView:)
!
这是古怪的部分。将地图视图添加到现有和可见视图(我使用视图控制器自己的视图),并将其放在屏幕外,只显示一个像素。这很重要,因为如果地图没有可见像素,它就不会渲染。 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步。如果正确配置地图,将调用(1)中提到的委托方法,此时您将拥有完全渲染的地图。