6
votes

I'm implementing a custom MKAnnotationView callout with the code explained here (Jacob's one), which actually places another Custom AnnotationView as the Annotation is selected:

MKAnnotationView - Lock custom annotation view to pin on location updates

Everything works just fine, but i've got some strange behavior. After tapping the custom callout, it will dismiss the callout but the regionDidChangeAnimated delegate method stops getting called at all afterwards.

I'm i missing something? I can pan the map as usual, but it won´t call that delegate method. Though if a do a zoom in or out it does gets called.

Prior to adding a custom CallOut for the AnnotationView's i'm placing, this never happened.

Thx in advance.

Regards, Alan //

1
We'll actually i've found out this happens on the original project everyone is using as a template on the iOS 5.1 emulator, so it's not my code. I'll try replacing the didSelectView with observers and see what happens.Alan Kennedy
I'm getting this issue also, it appears to occur when clicking the pin and holding whilst loading a new set of pins.Lloyd Powell

1 Answers

2
votes

I downloaded the XCode project from the link you mentioned and was able to reproduce the error. The following answer has a workaround that worked for me

MKMapView Not Calling regionDidChangeAnimated on Pan

For convenience I want to repeat the solution and how I applied it in the mentioned project

In CustomCalloutViewController.h add UIGestureRecognizerDelegate

@interface CustomCalloutViewController : UIViewController 
<MKMapViewDelegate, UIGestureRecognizerDelegate>

In CustomCalloutViewController.m in method viewDidLoad add before [super viewDidLoad];

if (NSFoundationVersionNumber >= 678.58){

    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureCaptured:)];
    pinch.delegate = self;          
    [mapView addGestureRecognizer:pinch];

    [pinch release];

    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureCaptured:)];
    pan.delegate = self;
    [mapView addGestureRecognizer:pan];

    [pan release];
}

Then still in CustomCalloutViewController.m add the following

#pragma mark -
#pragma mark Gesture Recognizers

- (void)pinchGestureCaptured:(UIPinchGestureRecognizer*)gesture{
    if(UIGestureRecognizerStateEnded == gesture.state){
        ///////////////////[self doWhatYouWouldDoInRegionDidChangeAnimated];
    }
}

- (void)panGestureCaptured:(UIPanGestureRecognizer*)gesture{
    if(UIGestureRecognizerStateEnded == gesture.state){


        NSLog(@"panGestureCaptured ended");
        // *************** Here it is *********************
        ///////////////////[self doWhatYouWouldDoInRegionDidChangeAnimated];
        // *************** Here it is *********************
    }
}

-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
    return YES;
}

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:   (UITouch *)touch{
    return YES;
}

Edit: I have found another workaround here (all down at the bottom the above workaround is mentioned, too). I did not try out, but sounds promissing. I repeat it here:

My workaround is simple: In your view controller, create the MKMapView in viewDidAppear:, and destroy it in viewDidDisappear:. I realize this isn't a friendly workaround for those using Interface Builder, but, in my view, it's the cleanest, and probably the best way to conserve memory in your app.