Невозможно поместить карты 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 секунды)
- Карта не реагирует на изменение камеры в методе
viewDidLoad
.
Любые предложения?
Я прочитал несколько сообщений здесь, в StackOverflow, но не смог найти правильное решение: (
Ответы
Ответ 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
в доске объявлений
![введите описание изображения здесь]()
- Измените класс на
GMSMapView
вместо UIView
![введите описание изображения здесь]()
-
Создайте ссылку в UIViewController
class
@IBOutlet weak var mapView: GMSMapView!
-
Поскольку вы являетесь подклассом, вам не нужно использовать этот GMSMapView.map(withFrame: CGRect.zero, camera: camera)
, упомянутый в документах. Просто загрузите карту следующим образом
let camera = GMSCameraPosition.camera(withLatitude: 51.50, longitude: -0.076, zoom: 10.0)
mapView.camera = camera
-
Чтобы добавить маркер
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: 51.50, longitude: -0.076)
marker.title = "London"
marker.snippet = "UK"
marker.map = mapView
-
Вместе как функция
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)
}