2016-10-15 14 views
6

Chcę wyświetlić mapy google w widoku, które jest następnie dodawane do self.view, zamiast rysować mapę bezpośrednio na self.view. Dlatego stworzyłem widok w storyboardie i zmieniłem jego klasę na GMSMapView. Stworzyłem także połączenie do tego widoku o nazwie gmView.Google Maps GMSMapView na niestandardowym UIView

używam następujący kod, który niestety nie pokazać mapę:

let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5)) 
gmView = mapView 

Również próbowałem dodanie mapView do self.view jako podrzędny, na przykład:

self.view.addSubview(mapView) 

.. .i wstawienie:

self.view.insertSubview(mapView, at: 0) 

Pamiętaj, że używam Auto Lay jeśli to zmieni cokolwiek.

Żadne z tych podejść nie działa dla mnie.
Jakieś pomysły?

+0

jeśli już stworzył wylot, co jest potrzebą alokacji MapView ponownie. Rób rzeczy w tym samym gmView ' –

Odpowiedz

12

Jeśli chcesz dodać mapView po załadowaniu view, musisz utworzyć obiekt o numerze GMSMapView. Więc przełamaj rynki twojego mapView, ponieważ będą one tworzone dynamicznie.

import UIKit 
import GoogleMaps 

class MapViewController: UIViewController { 

    //Take a Google Map Object. Don't make outlet from Storyboard, Break the outlet of GMSMapView if you made an outlet 
    var mapView:GMSMapView? 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     mapView = GMSMapView.map(withFrame: CGRect(x: 100, y: 100, width: 200, height: 200), camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5)) 

     //so the mapView is of width 200, height 200 and its center is same as center of the self.view 
     mapView?.center = self.view.center 

     self.view.addSubview(mapView!) 

    } 
} 

Oto dane wyjściowe. mapView ma width = 200 height = 200 oraz z centrum tak samo jak self.view

enter image description here

1

CGRect.zero zwróci widok o zerowej wysokości i zerowej szerokości. To będzie niewidoczne.

Nie ma też sensu dodawać go do scenorysu, jeśli chcesz zrobić własny przydział. Zamiast tego należy po prostu utworzyć właściwość kontrolera widoku programowo i ustawić jego ramkę tak, jak chcesz.

Uwaga: po wywołaniu polecenia "addSubview" w widoku zawsze będzie ono dodawane do górnej części widoku, więc nie ma potrzeby wstawiania go do danego indeksu. Korzystanie z automatycznego układu jest dobre, ale metoda viewDidLoad() zostaje wywołana przed ustawieniem wszystkich ograniczeń. Jeśli chcesz ustawić ramkę mapView = self.view, powinieneś to zrobić w viewDidAppear().

+0

Czy możesz pokazać kod? – LinusGeffarth

4

Można ustawić pusty UIView w układzie, i ustaw jego klasę w Inspektorze jako GMSMapView. Nie trzeba programowo go tworzyć.

Następnie wystarczy uzyskać referencję poprzez wylot do widoku i ustawić współrzędne/kamerę.

+0

To! Naprawia to również wiele problemów z autolayout i iPhone Plus! – Jan

+0

Dzięki. Zasadniczo działa to dla wszystkiego, co rozszerza klasę UIView, więc jest to najłatwiejszy sposób użycia storyboardu i automatycznego układu z widokami niestandardowymi – mylovemhz

12

W końcu zorientowałem się, jak wyświetlić mapę w UIView utworzonym w Storyboard i wyśrodkować ją w określonej lokalizacji.

Uwaga: Po utworzeniu ujścia UIView zmieniono jego klasę na GMSMapView, jak wyjaśniono wcześniej.

import UIKit 
import GoogleMaps 

class ViewController: UIViewController { 

    @IBOutlet weak var searchBar: UISearchBar! 
    @IBOutlet weak var toolBar: UIToolbar! 
    @IBOutlet weak var mapView: GMSMapView! 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     let camera = GMSCameraPosition.camera(withLatitude: 52.520736, longitude: 13.409423, zoom: 12) 
     self.mapView.camera = camera 

     let initialLocation = CLLocationCoordinate2DMake(52.520736, 13.409423) 
     let marker = GMSMarker(position: initialLocation) 
     marker.title = "Berlin" 
     marker.map = mapView 

    } 

I to jest wyjście: Map centred in Berlin

+0

dziękuję za pracę wowwwwww :) –

+1

self.mapView.camera = kamera // to jest ważna linia –

Powiązane problemy