10

I have placed a marker in GoogleMap which contains Image. but the size of image is much bigger. so how can i decrease the size of an marker. i have tried this :

marker.icon = self.image(marker.icon, scaledToSize: CGSize(width: 3.0, height: 3.0))
MrUpsidown
  • 21,592
  • 15
  • 77
  • 131
hussain
  • 769
  • 2
  • 7
  • 24

5 Answers5

16

To resize the image refer to :The simplest way to resize an UIImage?

Now the set the resized image as marker icon ,i.e,

marker.icon = self.imageWithImage(image: UIImage(named: "imageName")!, scaledToSize: CGSize(width: 3.0, height: 3.0))

Edit:

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
    image.drawInRect(CGRectMake(0, 0, newSize.width, newSize.height))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

Edit (swift 4)

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
    let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
}
Arash Etemad
  • 1,827
  • 1
  • 13
  • 29
PGDev
  • 23,751
  • 6
  • 34
  • 88
9

If you want to use an extension you can implement like this:

Swift 4.2

extension GMSMarker {
    func setIconSize(scaledToSize newSize: CGSize) {
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
        icon?.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        icon = newImage
    }
}

and use the extension like This:

let position = CLLocationCoordinate2D(latitude: yourLatitude,longitude: yourLongitude)
let marker = GMSMarker(position: position)
marker.title = "Receiver"
marker.icon = UIImage(named: "receiver_set")
marker. setIconSize(scaledToSize: .init(width: 40, height: 40))
marker.map = self.mapView
Kishan
  • 1,182
  • 12
  • 26
Mohsen mokhtari
  • 2,841
  • 1
  • 30
  • 39
5

Based in the answer of @PGDev

My implementation for Swift 3 is:

func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0);
        //image.draw(in: CGRectMake(0, 0, newSize.width, newSize.height))
        image.draw(in: CGRect(origin: CGPoint(x: 0,y :0), size: CGSize(width: newSize.width, height: newSize.height))  )
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }

And used in this way:

marker.icon = self.imageWithImage(image: UIImage(named: place.icon)!, scaledToSize: CGSize(width: 100.0, height: 100.0))
Benjamin RD
  • 11,516
  • 14
  • 87
  • 157
2

Another easy way is to use the new UIGraphicsImageRenderer

marker.icon = UIGraphicsImageRenderer(size: .init(width: 3.0, height: 3.0)).image { context in
    UIImage(named: "pin").draw(in: .init(origin: .zero, size: context.format.bounds.size))
}
Amr Mohamed
  • 2,290
  • 4
  • 20
  • 39
0

you can override this callback when camera position changed

func mapView(_ mapView: GMSMapView, idleAt cameraPosition: GMSCameraPosition) {
    self.mapView?.clear()
    //redraw your marker use smaller UIImage...
    ....
    var smallerImage : UIImage = UIImage(named: "example_icon")
    marker.icon = smallerImage
}
Jyo Huang
  • 11
  • 2