Change the image's origin of map annotation view?
Asked Answered
F

1

8

The regular annotation pin's origin is in the middle of the bottom so, the pin always point to the same place.

But when I add my custom image, its origin is the center of the image, so every zoom in or out, the bottom of my image point to a different place.

enter image description here

Here my pin is supposed to point to the center of paris BUT

enter image description here

but when I zoom in, the bottom of my pin isn't pointing to the center of Paris.

I'm trying with the CGRect.origin but didn't get anything useful.

Here is my code:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView * customPinView = [[MKAnnotationView alloc] init];
    UIImage * img = [UIImage imageNamed:@"waterPin.png"] ;
    CGRect resizeRect;
    resizeRect.size.height = 40;
    resizeRect.size.width = 40;
    resizeRect.origin = (CGPoint){0.0f, 0.0f};
    UIGraphicsBeginImageContext(resizeRect.size);
    [img drawInRect:resizeRect];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    customPinView.image = resizedImage;
    return customPinView;
}
Flopeared answered 21/11, 2012 at 11:23 Comment(5)
if you could post some code??Bellringer
What coordinates (lat/long) is the annotation set to exactly? Try setting customPinView.centerOffset to adjust the image offset (but I'd verify the coordinates first). Also, you should use initWithAnnotation instead of just init for MKAnnotationView.Cause
no no, the coordinates is right, but it's that little property, centerOffset, thanks a lotFlopeared
hello can you tell me how can we replace the default pin with "waterPin.png" .Ethelred
it is in code above, just get your image, and assign it to the image property of the annotation img = .....; pin.image = img;Flopeared
C
13

MKAnnotationView has a centerOffset property which you can try setting to adjust the image offset:

customPinView.centerOffset = CGPointMake(xOffset,yOffset);


Unrelated, but you should use initWithAnnotation instead of just init for creating an MKAnnotationView.
It also wouldn't hurt to use dequeueReusableAnnotationViewWithIdentifier and implement annotation view re-use to improve performance.

I would also suggest not programmatically resizing the image in the delegate method and instead using an already-resized image to begin with. Then you can just do customPinView.image = [UIImage imageNamed:@"resizedWaterPin.png"]; without spending run-time resizing the annotation images every time.

Cause answered 21/11, 2012 at 14:28 Comment(4)
what about the dragging?! I set it draggable = YES, but not all the view, I need to click in some exact places to drag it. I want it to be dragged wherever I touch itFlopeared
Make sure your annotation class implements setCoordinate otherwise it can't be dragged even if draggable is YES. See #11928192 and the documentation.Cause
it's dragging, yes I implemented the needed methods, but the pin itself, I need to touch them from specific locations, not any where of the pinFlopeared
I'm sorry but I don't understand. You might want to start a new question with more details.Cause

© 2022 - 2024 — McMap. All rights reserved.