12

Sono nuovo di iOS di programmazione e ho scaricato l'SDK Google maps per iOS e seguito le istruzioni sul loro sito web (come mostrato in questo link https://developers.google.com/maps/documentation/ios/start ) ed è stato in grado di ottenere la mappa nella mia applicazione.Come aggiungere un pulsante sulle mappe di Google in iOS?

Ora sto cercando di aggiungere un pulsante sullo schermo in basso su Google maps per dare un'opzione all'utente per tornare alla schermata precedente.

So solo che UIButton è una sottoclasse di UIView e possiamo fare apparire un pulsante su una vista rendendolo la vista secondaria di quella classe. In precedenza iOS utilizzava Google Maps come impostazione predefinita di MKMapView e ho visto esempi nei libri e su Internet che mostravano schermate di app in cui un pulsante o una casella di testo venivano visualizzati sulla mappa. Ma ora il semplice trascinamento del pulsante nel generatore di interfacce non aiuta con l'SDK di google maps.

Ecco il mio codice:

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 

Si può vedere che nelle ultime 2 righe ho fatto il pulsante il sottomenu di mapview e ha cercato di portarlo in primo piano. Ma questo non ha aiutato. Per favore fatemi sapere cosa mi manca o se c'è un altro modo per farlo usando qualche altra funzione.

Si prega inoltre di controllare lo screenshot dello storyboard che ho creato in modo da poter capire meglio quello che sto cercando di fare qui.

Screenshot of the storyboard

Grazie.

+1

cosa è il punto di distacco questo come nuova domanda in cui è già stato chiesto [qui] (http://stackoverflow.com/q/16436352/593709) –

risposta

15

GMSMapView è sottoclasse di UIView modo da poter aggiungere subviews da qualsiasi altra vista

Prova questo codice

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]; 

Si aggiunge 100x20 pulsante come la visualizzazione secondaria del GMSMapView, posizionato verso l'angolo in basso a destra . L'ho provato e il pulsante può essere toccato come in qualsiasi altra vista

Modifica: Spostare anche tutti i codici da -loadView a -viewDidLoad. Il metodo -loadView non viene mai chiamato quando si utilizza IB per creare l'interfaccia utente. Documenti a -loadView dice:

Se si utilizza Interface Builder per creare visualizzazioni e inizializzare il controller di visualizzazione, non è necessario sovrascrivere questo metodo.

Edit 2: Credo che quando si crea vista gerarchia usando Interface Builder, non è possibile ripristinare self.view proprietà come si sta facendo.

fare questo nel tuo -viewDidLoad

[self.view addSubview: mapView_]; 

invece di

self.view = mapView_; 

se si passa GMSMapView alla proprietà self.view, la mappa è solo vista che è nel controller da questo punto. Questo è, credo, il motivo per cui non riesci a vedere il tuo pulsante creato da IB.

+0

Thanks it lavorato. Ma ti sarò molto grato se solo potessi dirmi dove stavo sbagliando. Non posso creare un UIButton attraverso il generatore di interfacce come lo avete fatto in modo programmatico? – Manas

+0

Ho dovuto modificare l'ultima riga per farlo funzionare Ho cambiato '[_mapView addSubview: button];' per '[mapView_ addSubview: button];' – Manas

+0

Mi dispiace ma non posso aiutarti, perché Non sto più lavorando con l'interfaccia utente di Interface Builder. Forse potresti provare a spostare il codice da '-loadView' a' -viewDidLoad'. –

3

Fai la tua vista normalmente con InterfaceBuilder e di mettere MapView a 0 indice di visualizzazione secondaria:

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

Grazie a Raul Clauss da questo thread

E si può personalizzato la dimensione del MapView, modificare:

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

Dove mapHolder, è un UIView realizzato all'interno dell'IB.

3

Ho affrontato lo stesso problema e la correzione è molto semplice, basta eseguire l'override di questo metodo UIViewController:
-(void) viewWillAppear:(BOOL)animated e mettere la vostra logica UIButton creazione all'interno di tale metodo.

Esempio:

-(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]; 
}