12

Ich bin neu in iOS-Programmierung und ich habe den Google Maps-SDK für iOS heruntergeladen und folgte die Anweisungen auf ihrer Website (wie in diesem Link https://developers.google.com/maps/documentation/ios/start gezeigt) und konnte die Karte in meiner Anwendung bekommen.Wie füge ich eine Schaltfläche in Google Maps in iOS hinzu?

Jetzt versuche ich eine Schaltfläche auf dem Bildschirm über Google Maps hinzuzufügen, um dem Benutzer die Möglichkeit zu geben, zum vorherigen Bildschirm zurückzukehren.

Ich weiß nur, dass UIButton eine Unterklasse von UIView ist und wir können eine Schaltfläche in einer Ansicht erscheinen lassen, indem wir sie zur Unteransicht dieser Klasse machen. Zuvor verwendete iOS standardmäßig Google Maps von MKMapView und ich habe Beispiele in Büchern und im Internet gesehen, die Screenshots von Apps zeigten, bei denen eine Schaltfläche oder ein Textfeld auf der Karte angezeigt wurde. Aber das Ziehen des Buttons im Interface Builder hilft nicht beim SDK von Google Maps.

Hier ist mein Code:

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 

Sie, dass in den letzten 2 Zeilen sehen kann ich gemacht habe die Klicken Sie auf die Unteransicht von mapview und versuchen Sie es nach vorne zu bringen. Aber das hat nicht geholfen. Bitte lassen Sie mich wissen, was ich vermisse oder ob es eine andere Möglichkeit gibt, dies mit einer anderen Funktion zu tun.

Bitte überprüfen Sie auch den Screenshot des Storyboards, den ich erstellt habe, damit Sie besser verstehen, was ich hier versuche.

Screenshot of the storyboard

Dank.

+1

Was ist der Punkt diese als neue Frage der Entsendung, wo es schon gefragt wurde [hier] (http://stackoverflow.com/q/16436352/593709) –

Antwort

15

GMSMapView ist Unterklasse von UIView, so dass Sie Subviews als zu jeder anderen Ansicht

Versuchen Sie diesen Code

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

Es fügt 100x20 Taste als Subview des GMSMapView, positioniert in die rechte untere Ecke hinzufügen . Ich habe es getestet und der Knopf kann wie in jeder anderen Ansicht

geändert werden Bearbeiten: Verschieben Sie auch alle Ihren Code von -loadView zu -viewDidLoad. -loadView Methode wird nie aufgerufen, wenn IB zum Erstellen der Benutzeroberfläche verwendet wird. Docs to -loadView sagt:

Wenn Sie mit Interface Builder Ihre Ansichten erstellen und den View-Controller initialisieren, dürfen Sie diese Methode nicht überschreiben.

Edit 2: Ich glaube, wenn Sie Ansichtshierarchie mit Interface Builder erstellen, können Sie nicht zurückgesetzt self.view Eigenschaft wie Sie tun.

dies Ihre -viewDidLoad in Do

[self.view addSubview: mapView_]; 

statt

self.view = mapView_; 

wenn Sie GMSMapView zur self.view Eigenschaft sind vorbei, ist die Karte nur Ansicht, die von diesem Punkt in der Steuerung ist. Das ist, glaube ich, der Grund, warum du deinen IB-Button nicht sehen kannst.

+0

es Dank hat funktioniert. Aber ich werde Ihnen sehr dankbar sein, wenn Sie mir einfach sagen könnten, wo ich falsch liege. Kann ich einen UIButton nicht über den Interface Builder erstellen, wie Sie es programmatisch gemacht haben? – Manas

+0

Ich musste eine Änderung in der letzten Zeile machen, damit es funktioniert Ich änderte '[_mapView addSubview: button];' to '[mapView_ addSubview: button];' – Manas

+0

Es tut mir leid, aber ich kann Ihnen nicht helfen, denn aber Ich arbeite nicht mehr mit der Interface Builder-Benutzeroberfläche. Vielleicht könntest du versuchen, Code von '-loadView' nach '-viewDidLoad' zu verschieben. –

3

Machen Sie Ihre Ansicht normalerweise mit Interface und mapView bei 0 Index subview setzen:

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

Dank Raul Clauss von diesem thread

und Sie können benutzerdefinierte die Größe mapView ändern:

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

Wo mapHolder, ist eine UIView innerhalb der IB gemacht.

3

stand ich das gleiche Problem und die Lösung ist sehr einfach, außer Kraft setzen nur diese UIViewController Methode:
-(void) viewWillAppear:(BOOL)animated und Ihre UIButton Schaffung Logik innerhalb dieser Methode setzen.

Beispiel:

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