Как добавить кнопку на карты Google в iOS?

Я новичок в программировании iOS, и я загрузил SDK Google Maps для iOS и следовал инструкциям на их веб-сайте (как показано в этой ссылке https://developers.google.com/maps/documentation/ios/start ) и смог получить карту в своем приложении.

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

Я просто знаю, что UIButton является подклассом UIView, и мы можем заставить кнопку отображаться в представлении, сделав ее подпредставлением этого класса. Раньше iOS использовала Google Maps по умолчанию с помощью MKMapView, и я видел примеры в книгах и в Интернете, показывающие снимки экрана приложений, где на карте появлялась кнопка или текстовое поле. Но теперь простое перетаскивание кнопки в конструкторе интерфейсов не помогает с SDK гугл карт.

Вот мой код:

ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <GoogleMaps/GoogleMaps.h>


@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UIButton *btn;


@end

ViewController.m

#import "ViewController.h"
#import <MapKit/MapKit.h>
#import <GoogleMaps/GoogleMaps.h>
#import <CoreLocation/CoreLocation.h>


@interface ViewController ()

@end

@implementation ViewController
{
    GMSMapView *mapView_;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)loadView
{
    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.distanceFilter = kCLDistanceFilterNone;

    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];

    //Latitude and longitude of the current location of the device.
    double lati = locationManager.location.coordinate.latitude;
    double longi = locationManager.location.coordinate.longitude;
    NSLog(@"Latitude = %f", lati);
    NSLog(@"Longitude = %f", longi);

    CLLocation *myLocation = [[CLLocation alloc] initWithLatitude:lati longitude:longi];

    // Create a GMSCameraPosition that tells the map to display the coordinate

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:lati
                                                            longitude:longi
                                                                 zoom:11.5];

    mapView_ = [GMSMapView mapWithFrame:[[UIScreen mainScreen] bounds] camera:camera];
    mapView_.myLocationEnabled = YES;
    self.view = mapView_;

    // Creates a marker in the center of the map.
    GMSMarker *marker = [[GMSMarker alloc] init];
    marker.position = CLLocationCoordinate2DMake(lati, longi);
    marker.title = @"It's Me";
    marker.snippet = @"My Location";
    marker.map = mapView_;

    [mapView_ addSubview:_btn];
    [mapView_ bringSubviewToFront:_btn];

}
@end

Вы можете видеть, что в последних двух строках я сделал кнопку частью представления карты и попытался вывести ее на передний план. Но это не помогло. Пожалуйста, дайте мне знать, что мне не хватает, или есть ли другой способ сделать это с помощью какой-либо другой функции.

Пожалуйста, также проверьте скриншот раскадровки, которую я создал, чтобы вы могли лучше понять, что я пытаюсь здесь сделать.

Скриншот раскадровки

Спасибо.


person Manas    schedule 20.05.2013    source источник
comment
Какой смысл публиковать этот вопрос как новый, если он уже задан здесь   -  person Adil Soomro    schedule 20.05.2013


Ответы (4)


GMSMapView является подклассом UIView, поэтому вы можете добавлять подвиды, как и в любой другой вид.

Попробуйте этот код

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.frame = CGRectMake(mapView_.bounds.size.width - 110, mapView_.bounds.size.height - 30, 100, 20);
button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;
[button setTitle:@"Button" forState:UIControlStateNormal];
[mapView_ addSubview:button];

Он добавляет кнопку 100x20 в качестве подпредставления GMSMapView, расположенного в правом нижнем углу. Я проверил это, и кнопку можно коснуться, как и в любом другом представлении.

Изменить: также переместите весь свой код с -loadView на -viewDidLoad. Метод -loadView никогда не вызывается при использовании IB для создания пользовательского интерфейса. Документы к -loadView говорят:

Если вы используете Interface Builder для создания своих представлений и инициализации контроллера представления, вы не должны переопределять этот метод.

Редактировать 2: я считаю, что когда вы создаете иерархию представлений с помощью Interface Builder, вы НЕ МОЖЕТЕ сбросить свойство self.view, как вы делаете.

Сделайте это в своем -viewDidLoad

[self.view addSubview: mapView_];

вместо

self.view = mapView_;

если вы передаете GMSMapView свойству self.view, карта является единственным представлением, которое находится в контроллере с этой точки. Думаю, это и есть причина, по которой вы не видите кнопку, созданную IB.

person Lukas Kukacka    schedule 20.05.2013
comment
Спасибо, это сработало. Но я буду вам очень благодарен, если вы просто скажете мне, где я ошибаюсь. Разве я не могу сделать UIButton через построитель интерфейса так, как вы сделали это программно? - person Manas; 20.05.2013
comment
Мне пришлось внести изменения в последнюю строку, чтобы заставить ее работать, я изменил [_mapView addSubview:button]; на [mapView_ addSubview:button]; - person Manas; 20.05.2013
comment
Извините, но я не могу вам помочь, потому что я больше не работаю с пользовательским интерфейсом конструктора интерфейсов. Может быть, вы могли бы попытаться переместить код с -loadView на -viewDidLoad. - person Lukas Kukacka; 20.05.2013
comment
Извините, я исправил код выше в соответствии с вашим комментарием. - person Lukas Kukacka; 20.05.2013
comment
Другая проблема, с которой я сталкиваюсь сейчас, заключается в том, что если я не могу установить кнопку на своей раскадровке, то как установить идентификатор для перехода к предыдущему виду? - person Manas; 20.05.2013
comment
@LukasKukacka: Решение, которое вы мне дали, прекрасно подходит для программного создания кнопки, которая заставляет кнопку отображаться на карте, но это не помогает мне вернуться к предыдущему экрану, поскольку я не могу создать переход во время выполнения. Он должен присутствовать в раскадровке, а кнопка, которую я создал в раскадровке, не отображается в представлении. Пожалуйста, еще раз проверьте последние две строки ViewController.m. Следуя вашему предложению, я также переместил код в -viewDidLoad из -loadView. - person MK Singh; 20.05.2013
comment
@LukasKukacka: я считаю, что то, что вы упомянули во втором редактировании, должно быть теоретически правильным, но когда я заменил self.view = mapView_; на [self.view addSubview: mapView_];, моя программа вошла в бесконечный цикл, и экран не изменился с представления ползунка на представление карты, и я поместил NSLog команда в функции, которая печаталась непрерывно в течение 5 минут. Наконец мне пришлось вернуться к моему предыдущему коду. - person Manas; 20.05.2013
comment
Я думал, что, возможно, установка кода на -loadView вместо -viewDidLoad может остановить мою программу от перехода в бесконечный цикл, но это не так. - person Manas; 20.05.2013
comment
Теперь я думаю, что отображение карты через навигационный контроллер может быть проще. Но единственный недостаток в том, что панель навигации съела бы часть экрана, хотя меня интересует только маленькая кнопка до нужного. - person Manas; 20.05.2013
comment
Мне удалось получить альтернативное решение моей проблемы, как указано в комментарии выше, путем встраивания навигационного контроллера. - person Manas; 22.10.2013
comment
Я использую swift, и Edit 2, похоже, не работает. Я переместил свой код в viewDidLoad() и вижу свои кнопки, но view.addSubview(mapView) не работает. Я также пробовал view.insertSubview с индексом 0, и он имеет точно такой же эффект. Любые идеи, что я делаю неправильно? - person Xitcod13; 20.11.2016

Сделайте свой вид обычным с InterfaceBuilder и поместите mapView в 0 index subview:

mapView_ = [GMSMapView mapWithFrame:self.view.bounds camera:camera];
mapView_.myLocationEnabled = YES;
[self.view insertSubview:mapView_ atIndex:0];

Спасибо Раулю Клаусу из этой треда.

И вы можете настроить размер mapView, изменить:

mapView_ = [GMSMapView mapWithFrame:_mapHolder.bounds camera:camera];
mapView_.myLocationEnabled = YES;
[_mapHolder insertSubview:mapView_ atIndex:0];

Где mapHolder — это UIView, созданный внутри IB.

person Felipe FMMobile    schedule 30.11.2013

Я столкнулся с той же проблемой, и исправить ее очень просто, просто переопределите этот метод UIViewController:
-(void) viewWillAppear:(BOOL)animated и поместите логику создания UIButton в этот метод.

Пример:

-(void) viewWillAppear:(BOOL)animated
{
 locationButton = [UIButton buttonWithType:UIButtonTypeCustom];
 locationButton.frame = CGRectMake(0, 30, self.view.frame.size.width/6, self.view.frame.size.height/6);
 [locationButton setImage:[UIImage imageNamed:@"location_enabled.png"] forState:UIControlStateNormal];
 [self.view addSubview:locationButton];
}
person DevSherif    schedule 19.04.2015

Эта проблема возникает из-за того, что вы пытаетесь добавить вид карты с помощью кода, ранее вы добавляли кнопку с помощью конструктора интерфейса. Когда вы добавляете mapView, он добавляется вверху представления, поэтому ваша кнопка не отображается.

У вас есть два варианта сделать это.

Первый подход

  • Перетащите UIButton из построителя интерфейса и установите соответствующие ограничения введите здесь описание изображения

  • Затем создайте выход этой кнопки в соответствующем viewController

    @IBOutlet weak var bottonToAdd: UIButton!

  • После добавления представления карты в представление вставьте код удара, чтобы кнопка появилась вверху mapViewForScreen.addSubview(self.bottonToAdd) mapViewForScreen.bringSubviewToFront(self.bottonToAdd)

После вышеуказанных трех шагов вы можете узнать, что у вас есть кнопка над картой.

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

Второй подход

Если вы не хотите использовать построитель интерфейса, вы можете использовать для него приведенный ниже код.

    var bottonToAdd:UIButton = UIButton()
    bottonToAdd.setTitle("Button To Add", for: .normal)
    bottonToAdd.sizeToFit()
    bottonToAdd.center = mapViewForScreen.center
    bottonToAdd.tintColor = UIColor.blue
    mapViewForScreen.addSubview(bottonToAdd)
    mapViewForScreen.bringSubviewToFront(bottonToAdd)
person shubham    schedule 17.05.2019