show direction button in swift mapView using googleMaps api show direction button in swift mapView using googleMaps api swift swift

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])    }}