マップをself.view
に直接描画するのではなく、self.view
に追加されるビューにGoogleマップを表示したい。そのため、ストーリーボードでビューを作成し、そのクラスをGMSMapView
に変更しました。また、gmView
というビューへのアウトレット接続も作成しました。
残念ながら地図を表示しない次のコードを使用しています。
let mapView = GMSMapView.map(withFrame: CGRect.zero, camera: GMSCameraPosition.camera(withLatitude: 51.050657, longitude: 10.649514, zoom: 5.5))
gmView = mapView
また、次のように、サブビューとしてmapView
をself.view
に追加しようとしました。
self.view.addSubview(mapView)
...そしてそれを挿入する:
self.view.insertSubview(mapView, at: 0)
それが何かを変更する場合、自動レイアウトを使用していることに注意してください。
これらのアプローチはどれも私には役に立たないようです。
何か案は?
mapView
のロード後にview
を追加する場合は、GMSMapView
のオブジェクトを作成する必要があります。 mapView
は動的に作成されるため、アウトレットを壊してください。
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!)
}
}
出力は次のとおりです。 mapView
は幅= 200、高さ= 200で、中心はself.view
と同じです
最後に、ストーリーボードで作成されたUIViewでマップを表示し、特定の場所に中央揃えする方法を見つけました。
注:UIViewアウトレットを作成した後、前に説明したように、クラスをGMSMapViewに変更しました。
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
}
そして、これは出力です: ベルリンを中心とした地図
レイアウトに空白のUIViewを配置し、インスペクターでそのクラスをGMSMapViewとして設定できます。プログラムでインスタンス化する必要はありません。
次に、アウトレットを介してビューへの参照を取得し、座標/カメラを設定します。
とてもシンプル。次の手順を使用する
1)ストーリーボードを開く:ViewControllerのオブジェクトライブラリからUIViewをドロップします。
2)クラスにカスタムビューアウトレットを作成します。 (私のコードのviewForGMap)
3)クラスのコードに次の行を追加します。
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
}
出力:
ストーリーボード(Swift 4.2、Xcode 10)のView
のViewController
にGoogleマップを接続する非常に簡単な方法を次に示します。
私はViewController
MapLocationsViewController
を呼び出しています。
そのため、ストーリーボードで、ViewController
のクラスが適切なクラス(この例では私にとってはMapLocationsViewController
)を適切に参照していることを確認してください。
次に、View
オブジェクトをそのViewControllerにドラッグし、そのクラスをGMSMapView
に設定します。
View
オブジェクトをコードの@IBOutletにフックします(この例ではviewForGoogleMap
と名付けました)。
最小限のサンプルコードを次に示します。
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)
}
}
詳細については、 Google Maps docs をご覧ください。
CGRect.zeroは、高さと幅がゼロのビューを返します。それは見えなくなります。
また、独自の割り当てを行いたい場合は、ストーリーボードに追加することはあまり意味がありません。代わりに、View Controllerのプロパティをプログラムで作成し、そのフレームを必要なものに設定する必要があります。
ビューに対して「addSubview」を呼び出すと、常にビューの上部に追加されるため、特定のインデックスに挿入する必要はありません。自動レイアウトの使用は適切ですが、すべての制約が設定される前にviewDidLoad()が呼び出されます。 mapViewのframe = self.viewを設定できるようにしたい場合は、代わりにviewDidAppear()でそれを行います。
IOSでzPositionを使用できます。
SalonDetailViewという名前のビューがある場合、たとえば:
@IBOutlet weak var salonDetailView: UIView!
gMSMapViewのUIViewがあります。例:
@IBOutlet weak var mapViewUI: GMSMapView!
SalonDetailViewをmapViewUIの上部に表示するには、次のようにzPositionを使用します。
salonDetailView.layer.zPosition = 1