GMSMapView всегда отображает одно и то же местоположение iOS

как следует из названия, независимо от того, какие координаты я даю, я вижу одно и то же место.

Вот мой код:

Я использую раскадровку, и у меня есть подвид внутри моего представления. Подпредставление имеет тип GMSMapView и правильно связано.

.h

@property (strong, nonatomic) IBOutlet GMSMapView *mymap;

.m

@implementation DealViewController
{
    GMSMapView *mapView_;
}


@synthesize mymap=_mymap;

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

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                            longitude:151.2086
                                                                 zoom:6];
    mapView_ = [GMSMapView mapWithFrame:CGRectMake(0, 0, 300, 300) camera:camera];
    mapView_.myLocationEnabled  = YES;
    mapView_.mapType = kGMSTypeSatellite;
    mapView_.delegate = self;
    self.mymap=mapView_;

}

Я также пробовал это, но я получаю то же самое:

mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];

Что не так с вышесказанным?


person ghostrider    schedule 02.07.2013    source источник
comment
эта проблема решена? если вы видите местоположение в Европе (показывая Великобританию, Францию ​​​​и т. д.), то это местоположение карты по умолчанию, которое отображается, когда карта инициализируется как mapView_ = [[GMSMapView alloc] initWithFrame:CGRectZero]; без упоминания положения камеры. Таким образом, настройка положения камеры не работает.   -  person tony m    schedule 26.07.2013
comment
@tony нет, это не решено, но я использовал набор карт по умолчанию в IOS вместо карт Google. Спасибо, я проверю.   -  person ghostrider    schedule 26.07.2013
comment
проверьте, является ли это более ранним сообщением полезно   -  person tony m    schedule 27.07.2013
comment
вы нашли ответ?   -  person Efren    schedule 28.07.2017


Ответы (4)


После нескольких часов жестокого исследования той же проблемы я обнаружил, что метод viewDidLoad должен выглядеть так:

- (void)viewDidLoad
{
    [super viewDidLoad];

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:obj.latitude
                                 longitude:obj.longitude
                                 zoom:12];
    self.mapView.camera = camera;
}

Другими словами, в этом случае вы НЕ должны назначать какое-либо значение (например, '[GMSMapView mapWithFrame:CGRectMake(0, 0, 300, 300) camera:camera];') для self.mapView, просто установите его значение свойства 'camera'.

Это работает для меня. Я надеюсь, что это сэкономит время для кого-то еще.

person Dmitry Sikorsky    schedule 02.08.2013

Если вы используете раскадровки, убедитесь, что вы установили тип представления GMSMapView в пользовательском интерфейсе раскадровки.

Тогда все, что вам нужно сделать, это:

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

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                            longitude:151.2086
                                                                 zoom:6];
    self.mymap.camera = camera;
    self.mymap.myLocationEnabled  = YES;
    self.mymap.mapType = kGMSTypeSatellite;
    self.mymap.delegate = self;
}

Пример раскадровки доступен на странице GitHub Карт Google.

person skarE    schedule 03.07.2013
comment
подпредставление имеет тип GMSMapView, но представление имеет тип UIVIew. Вы также имеете в виду, что представление должно иметь тип GMSMapView? - person ghostrider; 03.07.2013
comment
Этот ответ помог мне создать карту со ссылкой на GMSMapView в .xib и с использованием автомакета. - person Lücks; 08.01.2014
comment
@skarE, можем ли мы предоставить адресную строку для GMSCameraPosition вместо широты/долготы - person Amit Battan; 05.09.2015

Я думаю, это ваша проблема:

@property (strong, nonatomic) IBOutlet GMSMapView *mymap;

@implementation DealViewController
{
    GMSMapView *mapView_;
}

@synthesize mymap=_mymap;

mapView_ = [GMSMapView mapWithFrame:CGRectMake(0, 0, 300, 300) camera:camera];

Ваша карта поступает из вашей раскадровки под названием mymap. Вы создаете переменную экземпляра с именем mapView_, но синтезируете mymap в _mymap... что отличается.

Вместо использования переменной экземпляра просто обращайтесь к свойству напрямую. Замените все экземпляры mapView_ на self.mymap.

Например:

self.mymap = [GMSMapView mapWithFrame:CGRectMake(0, 0, 300, 300) camera:camera];

Что касается того, почему он не перемещается в местоположение пользователя, вот что говорится в документации Google Maps iOS SDK о свойстве myLocationEnabled:

myLocationEnabled — определяет, включены ли точка и круг точности «Мое местоположение».

...чего он не делает, так это перемещает карту к местоположению текущего пользователя. Он показывает только точку и кружок местоположения пользователя на карте.

На вашей карте всегда отображается одно и то же местоположение, потому что вы никогда не меняете его. Вы создаете камеру, настроенную на (-33.8683, 151.2086), просите карту показать индикатор местоположения пользователя, но не просите карту изменить свое местоположение на местоположение пользователя.

Для этого вы можете использовать свойство карты myLocation для получения текущего местоположения пользователя, а затем метод animateToLocation для соответствующего перемещения карты.

person lxt    schedule 02.07.2013
comment
в документации по картам Google, когда используется приведенный выше код (игнорируйте myLocationEnabled), он должен дать мне область вокруг Сингапура, а не в Европе. Какие бы координаты я ни указывал, камера дает мне одно и то же местоположение (в центре где-то в Европе) и я вообще не вижу маркера. - person ghostrider; 02.07.2013
comment
Сидней с такими координатами, уж точно не Сингапур? - person lxt; 02.07.2013
comment
да, в приведенном выше примере я должен увидеть Сидни. Я пробовал также с Сингапуром, но в обоих случаях я вижу область в Европе без маркера. - person ghostrider; 02.07.2013
comment
Думаю, я понял это. Ваш синтез переменной экземпляра неверен. Я собираюсь отредактировать свой ответ выше, указав дополнительную информацию вверху. - person lxt; 02.07.2013
comment
спасибо за попытку, но, к сожалению, ничего не меняется. Если это имеет значение, я также добавил код для идентификации постукивания, но это тоже не работает, я не вижу сообщений журнала. Это похоже на то, что моя карта не отвечает, и просто дайте мне представление карты по умолчанию. - person ghostrider; 02.07.2013

GMSMapView, похоже, с трудом подходит к GMSCoordinateBounds в следующих ситуациях:

1) Вы инициализируете GMSMapView кадром .zero

2) GMSMapView еще не видно на экране

3) GMSMapView является подпредставлением любого заданного UIViewController

В любом из этих трех случаев вы должны установить камеру явно:

let camera = GMSCameraPosition.camera(withTarget: B.center, zoom: 19)
self.map.camera = camera
person Jon Vogel    schedule 29.06.2017