Rendern MKMapView offscreen

9

Ich versuche, ein MKMapView in ein UIImage zu rendern, ohne es auf dem Bildschirm anzuzeigen. Ich initiiere die Karte:

%Vor%

Ich habe auch die MKMapKitDelegate Methode mapViewDidFinishLoadingMap() implementiert. Diese Methode wird niemals aufgerufen, es sei denn, Ich füge die Karte der Ansichtshierarchie hinzu und mache sie sichtbar. Dies bedeutet, dass das Setzen von alpha auf 0 oder isHidden auf true nicht funktioniert (die Map wird in diesem Fall nicht geladen). Hilfe?

    
Macondo2Seattle 06.04.2017, 03:48
quelle

3 Antworten

0

OK, hier ist meine eigene Lösung.

  1. Implementieren Sie die MKMapViewDelegate Methode mapViewDidFinishRenderingMap(_ mapView:, fullyRendered:) . Stellen Sie sicher, dass Sie diese Methode anstelle von mapViewDidFinishLoadingMap(_ mapView:) verwenden!

  2. Hier ist der verrückte Teil. Fügen Sie Ihre Kartenansicht einer vorhandenen und sichtbaren Ansicht hinzu (ich habe die eigene Ansicht des Ansichtscontrollers verwendet) und positionieren Sie sie außerhalb des Bildschirms, wobei nur ein Pixel angezeigt wird. Dies ist wichtig, denn wenn die Karte keine sichtbaren Pixel enthält, wird sie nicht gerendert. Zum Beispiel:

    %Vor%
  3. Es gibt keinen Schritt 3. Wenn Sie die Map korrekt konfigurieren, wird die in (1) erwähnte Delegate-Methode aufgerufen, und an diesem Punkt haben Sie Ihre vollständig gerenderte Map.

Macondo2Seattle 18.04.2017, 05:22
quelle
0

Können Sie sagen, was Sie erreichen möchten, indem Sie sich verstecken? Wenn Ihr Bild nicht sichtbar ist, lädt die Karte keine Daten und deshalb wird der Delegat nicht wie im Apple Doc erwähnt aufgerufen. es heißt, dass es aufgerufen wird, wenn aktuelle Anfrage in Ihrem Fall geladen wurde ich denke, Karte ist nicht sichtbar, so dass seine Anfrage nicht geladen wird und wenn Sie es sichtbar machen, dann wird die Anfrage geladen und damit können Sie sehen.

  

Diese Methode wird aufgerufen, wenn die der aktuellen Anforderung zugeordneten Kartenkacheln geladen wurden. Kartenkacheln werden angefordert, wenn ein neuer sichtbarer Bereich in die Ansicht gerollt wird und die Kacheln nicht bereits verfügbar sind. Kartenkacheln können auch für Teile der Karte angefordert werden, die derzeit nicht sichtbar sind. Beispielsweise kann die Kartenansicht Kacheln laden, die den aktuell sichtbaren Bereich sofort umgeben, um kleine Schwenks durch den Benutzer zu handhaben.

     

Ссылка

    
Ourang-Zeb Khan 12.04.2017 10:53
quelle
0

Offenbar lädt MKMapView nur die sichtbaren Kacheln der Map, also muss das mapView , das Sie offline darstellen wollen, "sichtbar" sein.
Soweit ich weiß, ist eine Sicht "sichtbar", wenn die Eigenschaft window gesetzt ist, also nicht nil (siehe progrmr 's Antwort hier ).
Daher könnte es möglich sein, eine zusätzliche UIWindow einzurichten, die Ihre mapView als Root-Ansicht hat. In diesem Fall wird die window -Eigenschaft von mapView gesetzt, und ich glaube, dass mapView die erforderlichen Kacheln laden würde, damit <<> gerendert werden kann, selbst wenn die zusätzliche UIWindow nicht sichtbar ist .
Dies wird anscheinend ebenfalls von einem pageViewController gemacht, siehe den Kommentar von evanflash im obigen Link.

    
Reinhard Männer 17.04.2017 11:33
quelle