it-swarm.com.ru

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

Я борюсь с этой проблемой! Я хочу добавить карты Google 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 , он работает, но назначает карту в MAIN UIView, и это совсем другое.

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

  1. Система выдает ошибку, говорящую 

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

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

  1. Карта не отвечает ни на одно изменение камеры, выполненное методом viewDidLoad.

Какие-либо предложения?

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

40
AndreaZ

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

  1. Поместите представление в XIB и измените его класс на GMSMapView в XIB Builder. Смотрите * map1 ниже. Или же...
  2. Код это все. Добавьте карту как подпредставление основного вида. Смотрите * map2 ниже. Или же...
  3. Добавьте карту в качестве подпредставления другого подпредставления, уже имеющегося в XIB с выходом. * карта3 ниже.

.час

@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];
}
84
cloudsurfin

Проверили и приступили к работе в Swift 2.0 со всеми тремя опциями, предоставляемыми cloudsurfin . Перевод его ответа для тех, кто сталкивается с той же проблемой в Swift 2.0:

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

Option2 - закодируйте все это. Добавьте карту как подпредставление основного вида.

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

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

22
Mike K

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

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

.час

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

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

19
Eric Forbes

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

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

[super loadView];
8
Lirik

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

6
user2231017

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

  1. Добавьте UIView в UIViewController в раскадровке

 enter image description here

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

 enter image description here

  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
    }
    
5
Heshan Sandeepa

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

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

1
Omarj
(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;
}
0
Urvish Modi

После учебника 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)
}
0
Musa almatri