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

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

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

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

Вот мой код:

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 Me";
    marker.snippet = @"My Location";
    marker.map = mapView_;

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

}
@end

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

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

Screenshot of the storyboard

Спасибо.

Ответ 1

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

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

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, вы НЕ МОЖЕТЕ reset self.view, как вы это делаете.

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

[self.view addSubview: mapView_];

вместо

self.view = mapView_;

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

Ответ 2

Сделайте свой просмотр в обычном режиме с помощью InterfaceBuilder и поместите mapView в подкатегорию индекса 0:

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.

Ответ 3

Я столкнулся с той же проблемой, и исправление очень просто, просто переопределите этот метод 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];
}

Ответ 4

 let mapButton:UIButton = UIButton(frame: CGRect(x:self.view.bounds.width-50, y: 20, width: 40, height: 40)) //Swfit 5
    mapButton.backgroundColor = UIColor.clear
    mapButton.setImage(UIImage(named: "list"), for: UIControl.State.normal)
    mapButton.setImage(UIImage(named: "map"), for: UIControl.State.selected)
    mapButton.addTarget(self, action:#selector(self.mapListClicked), for: .touchUpInside)
    self.view.addSubview(mapButton)

Ответ 5

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

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

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

  • Перетащите UIButton из конструктора интерфейса и установите соответствующие ограничения enter image description here

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

    @IBOutlet weak var bottonToAdd: UIButton!

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

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

enter image description here

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

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

    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)