web-dev-qa-db-ja.com

カスタムUIView上のGoogleマップGMSMapView

マップを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

また、次のように、サブビューとしてmapViewself.viewに追加しようとしました。

self.view.addSubview(mapView)

...そしてそれを挿入する:

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

それが何かを変更する場合、自動レイアウトを使用していることに注意してください。

これらのアプローチはどれも私には役に立たないようです。
何か案は?

13
LinusGeffarth

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と同じです

enter image description here

25

最後に、ストーリーボードで作成された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

    }

そして、これは出力です: ベルリンを中心とした地図

24
celiux

レイアウトに空白のUIViewを配置し、インスペクターでそのクラスをGMSMapViewとして設定できます。プログラムでインスタンス化する必要はありません。

次に、アウトレットを介してビューへの参照を取得し、座標/カメラを設定します。

6
mylovemhz

とてもシンプル。次の手順を使用する

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

   }

enter image description here

出力:

enter image description here

6
Devendra Singh

ストーリーボード(Swift 4.2、Xcode 10)のViewViewControllerにGoogleマップを接続する非常に簡単な方法を次に示します。

私はViewControllerMapLocationsViewControllerを呼び出しています。

  1. そのため、ストーリーボードで、ViewControllerのクラスが適切なクラス(この例では私にとってはMapLocationsViewController)を適切に参照していることを確認してください。 Step 1

  2. 次に、ViewオブジェクトをそのViewControllerにドラッグし、そのクラスをGMSMapViewに設定します。 Step 2

  3. Viewオブジェクトをコードの@IBOutletにフックします(この例ではviewForGoogleMapと名付けました)。 Step 3

最小限のサンプルコードを次に示します。

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 をご覧ください。

2
user3773048

CGRect.zeroは、高さと幅がゼロのビューを返します。それは見えなくなります。

また、独自の割り当てを行いたい場合は、ストーリーボードに追加することはあまり意味がありません。代わりに、View Controllerのプロパティをプログラムで作成し、そのフレームを必要なものに設定する必要があります。

ビューに対して「addSubview」を呼び出すと、常にビューの上部に追加されるため、特定のインデックスに挿入する必要はありません。自動レイアウトの使用は適切ですが、すべての制約が設定される前にviewDidLoad()が呼び出されます。 mapViewのframe = self.viewを設定できるようにしたい場合は、代わりにviewDidAppear()でそれを行います。

1
Brad Hesse

IOSでzPositionを使用できます。

SalonDetailViewという名前のビューがある場合、たとえば:

@IBOutlet weak var salonDetailView: UIView!

私の場合は画像をご覧ください

gMSMapViewのUIViewがあります。例:

@IBOutlet weak var mapViewUI: GMSMapView!

SalonDetailViewをmapViewUIの上部に表示するには、次のようにzPositionを使用します。

salonDetailView.layer.zPosition = 1
0
abhijith k