hussain
hussain

Reputation: 810

Change the Size of Marker in GoogleMap using Swift

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

Upvotes: 11

Views: 12218

Answers (5)

Jyo Huang
Jyo Huang

Reputation: 11

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
}

Upvotes: 0

Mohsen mokhtari
Mohsen mokhtari

Reputation: 3062

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

Upvotes: 9

Amr Mohamed
Amr Mohamed

Reputation: 2380

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

Upvotes: 3

PGDev
PGDev

Reputation: 24341

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
}

Upvotes: 16

Benjamin RD
Benjamin RD

Reputation: 12044

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

Upvotes: 5

Related Questions