Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Size image pin annotation

I put the personal image instead of the traditional red pin. When I open the map to display the pin, the image cover the entire map. Is there a maximum size of the pin image or how do I integrate something in the code to fit the size standard classic pin?

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    if annotation is MKUserLocation {
        return nil
    }

    let annotationIdentifier = "SomeCustomIdentifier" // use something unique that functionally identifies the type of pin

    var annotationView: MKAnnotationView! = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier)

    if annotationView != nil {
        annotationView.annotation = annotation
    } else {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)

        annotationView.image = UIImage(named: "pin maps.png")

        annotationView.canShowCallout = true
        annotationView.calloutOffset = CGPointMake(-8, 0)

        annotationView.autoresizesSubviews = true
        annotationView.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure) as UIView
    }

    return annotationView
}
like image 429
Riccardo Caroli Avatar asked Oct 21 '15 15:10

Riccardo Caroli


2 Answers

There is not a maximum size of the pin image. You need to resize UIImage.

    let annotationIdentifier = "SomeCustomIdentifier"
    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: annotationIdentifier)
    if annotationView == nil {
        annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
        annotationView?.canShowCallout = true

        // Resize image
        let pinImage = UIImage(named: "pin maps.png")
        let size = CGSize(width: 50, height: 50)
        UIGraphicsBeginImageContext(size)
        pinImage!.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
        let resizedImage = UIGraphicsGetImageFromCurrentImageContext()

        annotationView?.image = resizedImage

        let rightButton: AnyObject! = UIButton(type: UIButtonType.detailDisclosure)
        annotationView?.rightCalloutAccessoryView = rightButton as? UIView
    }
    else {
        annotationView?.annotation = annotation
    }
like image 59
Kosuke Ogawa Avatar answered Sep 20 '22 15:09

Kosuke Ogawa


I know there is an accepted answer already, but it did not work for me. Kosuke Ogawa is correct that there is no maximum size and you must instead do some resizing. However, I found that modifying the Frame on the MKAnnotationView produces better results.

Kiko Lobo commented the solution that worked best for me, so all credit to him.

Instead of doing anything with the UIImage, you only need to edit the MKAnnotationView. Kibo Lobo's comment:

annotationView?.frame.size = CGSize(width: 30, height: 40)

I actually did this in C# with Xamarin, that looks like this:

annotationView.Frame = new CGRect(0,0,30,40);

The accepted answer had no effect when implemented in Xamarin. Hope this helps anyone else encountering image scaling issues. The UIImage.Scale() method made the image very fuzzy, while modifying the Frame kept the quality the same.

like image 44
Lucas Avatar answered Sep 22 '22 15:09

Lucas