42

我正在努力解决这个问题!我想将谷歌地图添加GMSMapViewUIView只是UIView我的主要部分的一部分ViewController

它应该很简单......我用UIView我想要的大小的情节提要 a 创建并将它放在 main 中UIView

来自接口文件的片段:

@interface MapViewController : UIViewController <CLLocationManagerDelegate>

@property(nonatomic) IBOutlet GMSMapView *mapView;

将 mapView 与UIViewmain中的 this 链接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 的类从UIView更改为GMSMapView. 地图显示在内部视图中,但它以一种奇怪的方式初始化

  1. 系统抛出错误说

“无法制作完整的帧缓冲区”

并大大减慢了视图的加载速度(在模拟器上需要 2-3 秒)

  1. 在该viewDidLoad方法中完成的任何相机更改中,地图都没有响应。

有什么建议么?

我在 StackOverflow 上阅读了一些帖子,但找不到有效的解决方案:(

4

10 回答 10

85

根据其他答案,这里有三种实际可行的方法。

  1. 在 XIB 上放置一个视图,并在 XIB 构建器中将其类更改为 GMSMapView。请参见下面的 *map1。或者...
  2. 全部编码。将地图添加为主视图的子视图。请参见下面的 *map2。或者...
  3. 将地图添加为已在 XIB 中带有插座的另一个子视图的子视图。*下面的地图3。

。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

已签出并开始在 Swift 2.0 中使用cloudsurfin提供的所有三个选项。为那些在 Swift 2.0 中面临同样问题的人翻译他的答案:

选项 1 - 在 XIB 上放置一个视图,并在 XIB 构建器中将其类更改为 GMSMapView。

选项 2 - 全部编码。将地图添加为主视图的子视图。

Option3 - 将地图添加为现有 UIView 子视图的 GMSMapView 子视图。

选项1在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. 将故事板中的 UIView 作为 UIView 实例变量链接到头文件,而不是 GMSMapView
  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 回答
11

你可以通过IB做到

.h
@property (weak, nonatomic) IBOutlet GMSMapView *theMapView;

.m
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
                                                        longitude:151.2086
                                                             zoom:12];

//This next line is not needed if you have a GMSMapView outlet
//self.theMapView = [GMSMapView mapWithFrame:self.theMapView.frame camera:camera];
self.theMapView.camera=camera;
self.theMapView.mapType = kGMSTypeSatellite;
self.theMapView.delegate=self;
于 2013-05-27T12:05:34.433 回答
10

我只是因为忘记添加这一行而出现黑屏:

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

对于 Swift 3,如果您将GMSMapView

  1. 添加UIViewUIViewController故事板

在此处输入图像描述

  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

我花了大约半个小时试图让它工作,然后我发现我用了错误的方法。谷歌入门示例告诉您将其放入 - (void)loadView 但如果您这样做,您会得到黑屏或全屏地图。你需要把它放在 - (void)viewDidLoad 中。然后它工作。

于 2013-04-01T06:23:30.407 回答
1

在身份检查器中将 UIVIEW 类设置为 GMSMapView。

然后从中制作一个 IBOutlet :D 并且它是工作 :P

于 2014-04-07T09:42:56.447 回答
0

遵循2017 年 9 月的Swift谷歌教程

我通过像这样将代码放入 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 回答
0
(void)viewDidLoad {
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86
                                                        longitude:151.20
                                                             zoom:14];

    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(-33.86, 151.20);
    marker.title = @"Sydney";
    marker.snippet = @"Australia";
    marker.map = self.mapContainerView;

    //set the camera for the map
    self.mapContainerView.camera = camera;

    self.mapContainerView.myLocationEnabled = YES;
}
于 2017-03-30T10:24:16.700 回答