show direction button in swift mapView using googleMaps api
I googled for this but I found nothing. so I did it manually. by overriding 'didTapMarker' I added these two buttons:
func mapView(mapView: GMSMapView, didTapMarker marker: GMSMarker) -> Bool { if marker.title != nil { let mapViewHeight = mapView.frame.size.height let mapViewWidth = mapView.frame.size.width let container = UIView() container.frame = CGRectMake(mapViewWidth - 100, mapViewHeight - 63, 65, 35) container.backgroundColor = UIColor.whiteColor() self.view.addSubview(container) let googleMapsButton = CustomButton() googleMapsButton.setTitle("", forState: .Normal) googleMapsButton.setImage(UIImage(named: "googlemaps"), forState: .Normal) googleMapsButton.setTitleColor(UIColor.blueColor(), forState: .Normal) googleMapsButton.frame = CGRectMake(mapViewWidth - 80, mapViewHeight - 70, 50, 50) googleMapsButton.addTarget(self, action: "markerClick:", forControlEvents: .TouchUpInside) googleMapsButton.gps = String(marker.position.latitude) + "," + String(marker.position.longitude) googleMapsButton.title = marker.title googleMapsButton.tag = 0 let directionsButton = CustomButton() directionsButton.setTitle("", forState: .Normal) directionsButton.setImage(UIImage(named: "googlemapsdirection"), forState: .Normal) directionsButton.setTitleColor(UIColor.blueColor(), forState: .Normal) directionsButton.frame = CGRectMake(mapViewWidth - 110, mapViewHeight - 70, 50, 50) directionsButton.addTarget(self, action: "markerClick:", forControlEvents: .TouchUpInside) directionsButton.gps = String(marker.position.latitude) + "," + String(marker.position.longitude) directionsButton.title = marker.title directionsButton.tag = 1 self.view.addSubview(googleMapsButton) self.view.addSubview(directionsButton) } return true }func markerClick(sender: CustomButton) { let fullGPS = sender.gps let fullGPSArr = fullGPS!.characters.split{$0 == ","}.map(String.init) let lat1 : NSString = fullGPSArr[0] let lng1 : NSString = fullGPSArr[1] let latitude:CLLocationDegrees = lat1.doubleValue let longitude:CLLocationDegrees = lng1.doubleValue if (UIApplication.sharedApplication().openURL(NSURL(string:"comgooglemaps://")!)) { if (sender.tag == 1) { UIApplication.sharedApplication().openURL(NSURL(string: "comgooglemaps://?saddr=&daddr=\(latitude),\(longitude)&directionsmode=driving")!) } else if (sender.tag == 0) { UIApplication.sharedApplication().openURL(NSURL(string: "comgooglemaps://?center=\(latitude),\(longitude)&zoom=14&views=traffic")!) } } else { let regionDistance:CLLocationDistance = 10000 let coordinates = CLLocationCoordinate2DMake(latitude, longitude) let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance) var options = NSObject() if (sender.tag == 1) { options = [ MKLaunchOptionsMapCenterKey: NSValue(MKCoordinate: regionSpan.center), MKLaunchOptionsMapSpanKey: NSValue(MKCoordinateSpan: regionSpan.span), MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving ] } else if (sender.tag == 0) { options = [ MKLaunchOptionsMapCenterKey: NSValue(MKCoordinate: regionSpan.center), MKLaunchOptionsMapSpanKey: NSValue(MKCoordinateSpan: regionSpan.span) ] } let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil) let mapItem = MKMapItem(placemark: placemark) mapItem.name = sender.title mapItem.openInMapsWithLaunchOptions(options as? [String : AnyObject]) } }
two buttons are added in the bottom right of the mapView and after tapping them, the googleMaps app (if exists) will be opened. thanks for vote down :(
Custom Button class:
class CustomButton: UIButton { var gps = "" override func awakeFromNib() { super.awakeFromNib() //TODO: Code for our button }}
I was having the same issue but in Objective-c and by following your code i've implemented.For those who wants to add the direction icon using Google Maps after tapping the Marker icon, the code below worked for me:
-(bool)mapView:(GMSMapView *)mapView didTapMarker:(GMSMarker *)marker{ UIButton *directionsButton = [[UIButton alloc] init]; [directionsButton setTitle:@"" forState:UIControlStateNormal]; [directionsButton setImage:[UIImage imageNamed:@"ic_google_direction"] forState:UIControlStateNormal]; [directionsButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; [directionsButton setFrame:CGRectMake(self->mapView.frame.size.width - 110, self->mapView.frame.size.height - 130, 50, 50)]; [directionsButton addTarget:self action:@selector(markerClick) forControlEvents:UIControlEventTouchUpInside]; [directionsButton setTag:1]; [[self view] addSubview:directionsButton]; return NO;}-(void) markerClick{ NSMutableArray *installedNavigationApps = [[NSMutableArray alloc] initWithObjects:@"Apple Maps", nil]; if ([[UIApplication sharedApplication] canOpenURL: [NSURL URLWithString:@"comgooglemaps://"]]) { [installedNavigationApps addObject:@"Google Maps"]; } UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:@"Selecione um aplicativo" message:@"Abrir com" preferredStyle:UIAlertControllerStyleActionSheet]; for (NSString *app in installedNavigationApps) { if([app isEqualToString:@"Apple Maps"]){ [actionSheet addAction:[UIAlertAction actionWithTitle:app style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [[UIApplication sharedApplication] openURL: [NSURL URLWithString: [NSString stringWithFormat:@"http://maps.apple.com/?saddr=%@,%@&daddr=%@,%@", _latitude, _longitude, _denuncia.Latitude, _denuncia.Longitude]]]; }]]; } else if([app isEqualToString:@"Google Maps"]){ [actionSheet addAction:[UIAlertAction actionWithTitle:app style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) { [[UIApplication sharedApplication] openURL: [NSURL URLWithString: [NSString stringWithFormat:@"comgooglemaps://?saddr=%@,%@&daddr=%@,%@&zoom=14&directionsmode=driving", _latitude, _longitude, _denuncia.Latitude, _denuncia.Longitude]]]; }]]; } } [actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]]; // Present action sheet. [self presentViewController:actionSheet animated:YES completion:nil];}
i using code for swift version 3. and I change contain view that i add subview of UIImageView to containView.
Adding two button on google map. and I use code of Lithium with on the top.
func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool { if marker.title != nil { let mapViewHeight = mapView.frame.size.height let mapViewWidth = mapView.frame.size.width let container = UIView() container.frame = CGRect.init(x: mapViewWidth - 100, y: mapViewHeight - 63, width: 65, height: 35) container.backgroundColor = UIColor.white self.view.addSubview(container) let googleMapsButton = CustomButton() googleMapsButton.setTitle("", for: .normal) googleMapsButton.setImage(UIImage(named: "googlemaps")?.resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 50, right: 50)),for: .normal) googleMapsButton.setTitleColor(UIColor.blue, for: .normal) googleMapsButton.frame = CGRect.init(x: mapViewWidth - 80, y: mapViewHeight - 70, width: 50, height: 50) googleMapsButton.addTarget(self, action: #selector(self.markerClick(sender:)), for: .touchUpInside) googleMapsButton.gps = String(marker.position.latitude) + "," + String(marker.position.longitude) googleMapsButton.title = marker.title googleMapsButton.tag = 0 let directionsButton = CustomButton() directionsButton.setTitle("", for: .normal) directionsButton.setImage(UIImage(named: "googlemapsdirection")?.resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 50, right: 50)),for: .normal) directionsButton.setTitleColor(UIColor.blue, for: .normal) directionsButton.frame = CGRect.init(x:mapViewWidth - 110, y:mapViewHeight - 70, width:50, height: 50) directionsButton.addTarget(self, action: #selector(self.markerClick(sender:)), for: .touchUpInside) directionsButton.gps = String(marker.position.latitude) + "," + String(marker.position.longitude) directionsButton.title = marker.title directionsButton.tag = 1 self.view.addSubview(googleMapsButton) self.view.addSubview(directionsButton) } return false}func markerClick(sender:CustomButton){ let fullGPS = sender.gps let fullGPSArr = fullGPS!.characters.split{$0 == ","}.map(String.init) let lat1 : String = fullGPSArr[0] let lng1 : String = fullGPSArr[1] guard let lat1_double = Double(lat1),let lng1_double = Double(lng1) else{ return } let latitude:CLLocationDegrees = lat1_double let longitude:CLLocationDegrees = lng1_double if (UIApplication.shared.openURL(URL(string:"comgooglemaps://")!)) { if (sender.tag == 1) { UIApplication.shared.openURL(URL(string: "comgooglemaps://?saddr=&daddr=\(latitude),\(longitude)&directionsmode=driving")!) } else if (sender.tag == 0) { UIApplication.shared.openURL(URL(string: "comgooglemaps://?center=\(latitude),\(longitude)&zoom=14&views=traffic")!) } } else { let regionDistance:CLLocationDistance = 10000 let coordinates = CLLocationCoordinate2DMake(latitude, longitude) let regionSpan = MKCoordinateRegionMakeWithDistance(coordinates, regionDistance, regionDistance) var options : NSDictionary! = nil if (sender.tag == 1) { options = [ MKLaunchOptionsMapCenterKey: NSValue.init(mkCoordinate: regionSpan.center), MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span), MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving ] } else if (sender.tag == 0) { options = [ MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: regionSpan.center), MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: regionSpan.span) ] } let placemark = MKPlacemark(coordinate: coordinates, addressDictionary: nil) let mapItem = MKMapItem(placemark: placemark) mapItem.name = sender.title mapItem.openInMaps(launchOptions: options as? [String : Any]) }}