Je souhaite afficher Google Maps sur une vue qui est ensuite ajoutée à self.view
, plutôt que de dessiner la carte directement sur self.view
. Par conséquent, j'ai créé une vue dans le storyboard et changé sa classe en GMSMapView
. J'ai également créé une connexion de sortie à cette vue appelée gmView
.
J'utilise le code suivant qui n'affiche malheureusement pas la carte:
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5))
gmView = mapView
J'ai également essayé d'ajouter le mapView
à self.view
comme une sous-vue, comme ceci:
self.view.addSubview(mapView)
... et en l'insérant:
self.view.insertSubview(mapView, at: 0)
Notez que j'utilise la disposition automatique si cela change quelque chose.
Aucune de ces approches ne semble fonctionner pour moi.
Des idées?
Si vous souhaitez ajouter un mapView
après le chargement du view
, vous devez créer un objet de GMSMapView
. Brisez donc les prises de votre mapView
car il sera créé dynamiquement.
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!)
}
}
Voici la sortie. mapView
a une largeur = 200 et une hauteur = 200 avec un centre identique à self.view
J'ai finalement compris comment afficher la carte dans une UIView créée dans Storyboard et la centrer dans un emplacement spécifique.
Remarque: Après avoir créé la sortie UIView, j'ai changé sa classe en GMSMapView comme expliqué précédemment.
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
}
Et voici la sortie: Carte centrée à Berlin
Vous pouvez positionner une UIView vierge dans votre mise en page et définir sa classe dans l'inspecteur en tant que GMSMapView. Vous n'aurez pas besoin de l'instancier par programme.
Ensuite, obtenez simplement une référence via la sortie à la vue et définissez vos coordonnées/caméra.
Très simple. Utilisez les étapes suivantes
1) Ouvrir le Storyboard: déposez une UIView de la bibliothèque d'objets dans votre ViewController.
2) Créez une sortie de vue personnalisée dans votre classe. (viewForGMap dans mon code)
3) Ajoutez la ligne suivante pour le code dans votre classe.
class GMapVC: UIViewController {
@IBOutlet weak var viewForGMap: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let camera = GMSCameraPosition.camera(withLatitude: 28.7041, longitude: 77.1025, zoom: 10.0)
let mapView = GMSMapView.map(withFrame: self.viewForGMap.frame, camera: camera)
self.view.addSubview(mapView)
// Creates a marker in the center of the map.
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: 28.7041, longitude: 77.1025)
marker.title = "Delhi"
marker.snippet = "India’s capital"
marker.map = mapView
}
Production:
Voici un moyen très simple de connecter Google Maps à un View
dans votre ViewController
dans un storyboard (Swift 4.2, Xcode 10).
J'appelle mon ViewController
MapLocationsViewController
.
Donc, dans votre storyboard, assurez-vous que la classe de votre ViewController
fait correctement référence à votre classe correcte (MapLocationsViewController
pour moi dans cet exemple).
Ensuite, faites glisser un objet View
sur ce ViewController et définissez cette classe sur GMSMapView
.
Accrochez cet objet View
à un @IBOutlet dans votre code (que j'ai nommé viewForGoogleMap
dans mon exemple).
Voici un exemple de code minimaliste:
import UIKit
import GoogleMaps
class MapLocationsViewController: UIViewController {
@IBOutlet weak var viewForGoogleMap: GMSMapView!
override func viewDidLoad() {
super.viewDidLoad()
let mapView = GMSMapView(frame: self.view.bounds)
viewForGoogleMap.addSubview(mapView)
}
}
Pour plus d'informations, consultez le Google Maps docs .
CGRect.zero renverra une vue avec une hauteur et une largeur nulles. Ce sera invisible.
De plus, cela n'a pas vraiment de sens de l'ajouter au storyboard si vous voulez faire votre propre allocation. À la place, vous devez simplement créer une propriété du contrôleur de vue par programme et définir son cadre pour qu'il soit celui que vous souhaitez.
Notez que lorsque vous appelez 'addSubview' à une vue, elle sera toujours ajoutée en haut de la vue, il n'est donc pas nécessaire de l'insérer à un index donné. L'utilisation de la mise en page automatique est bonne, mais viewDidLoad () est appelé avant que toutes les contraintes ne soient définies. Si vous voulez pouvoir définir frame = self.view de votre mapView, vous devriez le faire dans viewDidAppear () à la place.
Nous pouvons utiliser zPosition dans iOS.
Si nous avons une vue nommée salonDetailView, par exemple:
@IBOutlet weak var salonDetailView: UIView!
et avoir UIView pour GMSMapView, par exemple:
@IBOutlet weak var mapViewUI: GMSMapView!
Pour afficher salonDetailView en haut de la mapViewUI, utilisez zPosition comme ci-dessous:
salonDetailView.layer.zPosition = 1