8

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
  • 20,698
  • 12
  • 69
  • 122
hussain
  • 713
  • 2
  • 7
  • 23

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,733
  • 1
  • 15
  • 27
PGDev
  • 22,484
  • 6
  • 31
  • 76
8

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,142
  • 12
  • 26
Mohsen mokhtari
  • 2,525
  • 1
  • 27
  • 34
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
  • 10,530
  • 11
  • 78
  • 145
0

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,170
  • 4
  • 17
  • 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