42

私はこの問題に苦労しています!のメインの一部に過ぎないGoogle マップGMSMapViewUIViewUIViewViewController

シンプルなはずなのに… 絵コンテで作りUIViewたいサイズでメインに入れてみましたUIView

インターフェイス ファイルの抜粋:

@interface MapViewController : UIViewController <CLLocationManagerDelegate>

@property(nonatomic) IBOutlet GMSMapView *mapView;

UIViewmain 内でこれにリンクされた mapView を使用しUIViewます。

実装で私がすること:

@synthesize mapView = _mapView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                            longitude:151.2086
                                                                 zoom:10];
    _mapView = [GMSMapView mapWithFrame:_mapView.bounds camera:camera];
    _mapView.myLocationEnabled = YES;

}

これはうまくいくはずですよね?私が得るのは、内部の UIView が空であることです。

Google のスターティング ガイドGoogle Map Integration Documentに従ってマップをインスタンス化すると、機能しますが、マップが MAIN UIView に割り当てられ、それは別のことです。

ストーリーボードの mapView のクラスを から に変更してみましUIViewGMSMapView。マップは内側のビューに表示されますが、奇妙な方法で初期化されています

  1. というエラーをスローするシステム

「完全なフレーム バッファの作成に失敗しました」

ビューの読み込みが大幅に遅くなります(シミュレーターでは2〜3秒かかります)

  1. viewDidLoadメソッドで行われたカメラの変更にマップが応答しません。

助言がありますか?

ここで StackOverflow に関するいくつかの投稿を読みましたが、有効な解決策が見つかりませんでした:(

4

10 に答える 10

85

他の回答に基づいて、実際に機能する 3 つの方法を次に示します。

  1. XIB にビューを配置し、そのクラスを XIB ビルダーで GMSMapView に変更します。以下の *map1 を参照してください。または...
  2. すべてをコーディングします。メイン ビューのサブビューとしてマップを追加します。以下の *map2 を参照してください。または...
  3. アウトレットを持つ XIB に既にある別のサブビューのサブビューとしてマップを追加します。*下のmap3。

.h

@interface GPViewController : UIViewController
@property (strong, nonatomic) IBOutlet GMSMapView *map1;
@property (strong, nonatomic) IBOutlet UIView *plainViewOnXIBHoldsMap3;
@end

.m

- (void)viewDidLoad{
    [super viewDidLoad];
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.0
                                                        longitude:151.20
                                                             zoom:6];

    /* Option 1. view on XIB is class GSMMapView */
    self.map1.camera = camera;

    /* Option 2. add a map as a subview */
    GMSMapView *map2 = [GMSMapView mapWithFrame:CGRectMake(0, 0, 100, 100) camera:camera];
    [self.view addSubview:map2];

    /* Option 3. add a map to a subview already on the XIB */
    GMSMapView *map3 = [GMSMapView mapWithFrame:self.plainViewOnXIBHoldsMap3.bounds camera:camera];
    [self.plainViewOnXIBHoldsMap addSubview:map3];
}
于 2013-07-19T20:30:58.550 に答える
23

cloudsurfinが提供する 3 つのオプションすべてをチェックアウトして、Swift 2.0 で作業を開始します。Swift 2.0 で同じ問題に直面した人のために、彼の答えを翻訳します。

オプション 1 - ビューをXIBに置き、そのクラスを XIB ビルダーで GMSMapView に変更します。

オプション 2 - すべてをコーディングします。メイン ビューのサブビューとしてマップを追加します。

オプション 3 - 既存の UIView サブビューの GMSMapView サブビューとしてマップを追加します

Option1 のXIBでの準備の説明:

1) ビューのクラスを設定します。

GMSMapView マーク

2) ビューをコードのアウトレットに接続することを忘れないでください:

ビューとコンセントの接続

import UIKit
import GoogleMaps

class MapViewController: UIViewController {

    @IBOutlet weak var map1 : GMSMapView!

    @IBOutlet weak var map3 : UIView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let camera = GMSCameraPosition.cameraWithLatitude(53.9,
        longitude: 27.5667, zoom: 6)

        // Option 1. view on XIB is class GSMMapView
        self.map1.camera = camera;

        // Option 2. add a map as a subview
        let map2 = GMSMapView.mapWithFrame(CGRectMake(0, 64, 320, 460), camera:camera)
        self.view.addSubview(map2)

        // Option 3. add a map to a subview of UIView class that is already on the XIB
        let map3 = GMSMapView.mapWithFrame(self.plainViewOnXIBHoldsMap3.bounds, camera:camera)
        self.plainViewOnXIBHoldsMap3.addSubview(map3)
    }
}

このメモが誰かに役立つことを願っています:)

于 2015-10-15T17:04:10.307 に答える
19

私の提案:

  1. GMSMapView ではなく、UIView インスタンス変数として、ストーリーボードから UIView をヘッダー ファイルにリンクします。
  2. mapWithFrame:camera: メソッドを変更して、リンクされた UIView の境界に設定します
  3. viewDidLoad: メソッドの最後で、UIView インスタンス変数を GMSMapView に設定するか、サブビューを追加します。私もこれで問題を抱えていましたが、これをいじると通常はうまくいきます。

.h

@interface MapViewController: UIViewController <CLLocationManagerDelegate>
{
    IBOutlet UIView *mapViewOnSreen;
}

.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                                longitude:151.2086
                                                                     zoom:10];
    _mapView = [GMSMapView mapWithFrame:mapViewOnScreen.bounds camera:camera];
    _mapView.myLocationEnabled = YES;

    mapViewOnScreen = _mapView
    //OR [self.view addSubview:_mapView];
    //OR [mapViewOnScreen addSubview:_mapView];   <--This worked for me
}

*編集: IB を使用して、メイン ビュー内に小さな UIView を作成しました。リストされた手順に従い、 [mapViewOnScreen addSubview:_mapView]; を設定すると、小さな UIView 内にマップを表示できました。

于 2013-03-20T12:47:53.977 に答える
10

次の行を追加するのを忘れたという理由だけで、黒い画面が表示されました。

[super loadView];
于 2013-06-07T13:57:37.820 に答える
8

Swift 3 の場合、サブクラス化する場合はGMSMapView

  1. ストーリー ボードに追加UIViewするUIViewController

ここに画像の説明を入力

  1. GMSMapView代わりにクラスを変更しますUiView

ここに画像の説明を入力

  1. UIViewControllerクラスで参照を作成する

    @IBOutlet weak var mapView: GMSMapView!
    
  2. GMSMapView.map(withFrame: CGRect.zero, camera: camera)サブクラス化しているため、ドキュメントに記載されているものを使用する必要はありません。次のようにマップをロードするだけです

        let camera = GMSCameraPosition.camera(withLatitude: 51.50, longitude: -0.076, zoom: 10.0)
        mapView.camera = camera
    
  3. マーカーを追加するには

    let marker = GMSMarker()
    marker.position = CLLocationCoordinate2D(latitude: 51.50, longitude: -0.076)
    marker.title = "London"
    marker.snippet = "UK"
    marker.map = mapView
    
  4. 機能として一緒に

    override func viewDidLoad() {
    super.viewDidLoad()
    
      load()
    }
    
    func load() {
      //map
      let camera = GMSCameraPosition.camera(withLatitude: 51.50, longitude: -0.076, zoom: 10.0)
      mapView.camera = camera
    
      //marker
      let marker = GMSMarker()
      marker.position = CLLocationCoordinate2D(latitude: 51.50, longitude: -0.076)
      marker.title = "London"
      marker.snippet = "UK"
      marker.map = mapView
    }
    
于 2018-01-30T08:56:06.293 に答える
7

これを機能させるために約30分を費やした後、間違った方法でそれを行っていることがわかりました. Google のはじめにの例では、(void)loadView に配置するように指示されていますが、そうすると、黒い画面または全画面のマップが表示されます。- (void)viewDidLoad に入れる必要があります。その後、動作します。

于 2013-04-01T06:23:30.407 に答える
1

ID インスペクターで UIVIEW クラスを GMSMapView に設定します。

それから IBOutlet を作成します:D そして、それはうまくいきます:P

于 2014-04-07T09:42:56.447 に答える
0

2017年9月のSwiftのGoogleチュートリアルに従う

このようにviewDidLoadにコードを入れて修正しました

var mapView: GMSMapView!

override func viewDidLoad() {
    super.viewDidLoad()

    // Create a GMSCameraPosition to display the initial center of the map
    let camera = GMSCameraPosition.camera(withLatitude: 23.885942, longitude: 45.079162, zoom: 5.1)

    // Set the frame size , don't forget to replace "<CustomFrame>" with the required frame size
    mapView = GMSMapView.map(withFrame: "<CustomFrame>", camera: camera)

    // Add the map to any view here 
    view.addSubview(mapView)  //or customView.addSubview(mapView)
}
于 2017-09-11T14:21:59.133 に答える