Подтвердить что ты не робот

Невозможно поместить карты Google GMSMapView в подзаголовок основного основного вида?

Я борюсь с этой проблемой! Я хочу добавить google maps GMSMapView в UIView, который является только частью основного UIView моего ViewController.

Это должно быть просто... Я создал с раскадровкой UIView размера, который я хочу, и поместил его в основной UIView.

Фрагмент из файла интерфейса:

@interface MapViewController : UIViewController <CLLocationManagerDelegate>

@property(nonatomic) IBOutlet GMSMapView *mapView;

С mapView, связанным с этим UIView внутри основного 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, он работает, но он присваивает карту MAIN UIView, и это другой предмет.

Я попытался даже изменить класс моего mapView в раскадровке от UIView до GMSMapView. Карта отображается во внутреннем виде, но она инициализируется странным образом, делая

  • Система бросает сообщение об ошибке

"Не удалось создать полный буфер кадра"

и значительно замедляет загрузку представления (на симуляторе требуется 2-3 секунды)

  1. Карта не реагирует на изменение камеры в методе viewDidLoad.

Любые предложения?

Я прочитал несколько сообщений здесь, в StackOverflow, но не смог найти правильное решение: (

4b9b3361

Ответ 1

На основе других ответов, вот три способа, которые действительно работают.

  • Поместите представление на XIB и измените его класс на GMSMapView в построителе XIB. См. * Map1 ниже. Или...
  • Введите код. Добавьте карту в качестве подсмотра основного вида. См. * Map2 ниже. Или...
  • Добавить карту в качестве подзапроса другого подвидного объекта уже в 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];
}

Ответ 2

Выбрали и заработали в Swift 2.0 все три параметра, предоставленные cloudurfin. Перевод ответа для тех, кто сталкивается с той же проблемой в Swift 2.0:

Option1 - Поместите представление на XIB и измените его класс на GMSMapView в построителе XIB.

Вариант2 - код всего. Добавьте карту в качестве подсмотра основного вида.

Option3 - Добавить карту как подпрограмму GMSMapView уже существующего подвэка UIView.

Объяснение препаратов в XIB для Option1:

1) Установите класс для вашего представления:

GMSMapView Mark

2) Не забудьте подключить свой вид к розетке в коде:

Connecting view and outlet

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)
    }
}

Надеемся, что эта заметка поможет кому-то:)

Ответ 3

Мои предложения:

  • Свяжите UIView с раскадровкой в ​​файл заголовка как переменную экземпляра UIView, а не GMSMapView
  • Измените mapWithFrame: camera: метод, который будет установлен на ваши связанные ограничения UIView
  • В конце метода viewDidLoad: установите переменную экземпляра UIView в свой GMSMapView или добавьте subview. У меня также были проблемы с этим, и обман с этим обычно будет работать.

.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
}

* Edit: я создал небольшой UIView внутри основного вида с использованием IB. Я выполнил перечисленные шаги, и мне удалось просмотреть карту внутри небольшого UIView, когда я установил [mapViewOnScreen addSubview: _mapView];

Ответ 4

вы можете сделать это через 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;

Ответ 5

Я получал черный экран только потому, что забыл добавить эту строку:

[super loadView];

Ответ 6

Я потратил около получаса, пытаясь заставить это работать, и затем я понял, что у меня это было неправильно. В примере с запуском google вы указываете его в - (void) loadView, но если вы сделаете это, вы получите черный экран или полную экранную карту. Вам нужно поместить его в (void) viewDidLoad. Затем он работает.

Ответ 7

Для Swift 3 и если вы подклассом GMSMapView

  • Добавить UIView в UIViewController в доске объявлений

введите описание изображения здесь

  1. Измените класс на GMSMapView вместо UIView

введите описание изображения здесь

  1. Создайте ссылку в UIViewController class

    @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
    }
    

Ответ 8

установите для класса UIVIEW GMSMapView в инспекторе идентификации.

затем сделайте из него IBOutlet: D и hola это работа: P

Ответ 9

(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;
}

Ответ 10

Следуя руководству Google для Swift в сентябре-2017

Я исправил, поставив код в 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)
}