2012-06-09 7 views
6

Ich bin eine benutzerdefinierte MKAnnotationView callout Umsetzung mit dem Code hier erklärt (Jakobs eins), die eigentlich eine andere Gewohnheit AnnotationView als Annotation platziert ausgewählt:MKMapKit regionDidChangeAnimated stoppt nach benutzerdefinierten Callout Klopfen

MKAnnotationView - Lock custom annotation view to pin on location updates

Alles funktioniert gut, aber ich habe ein seltsames Verhalten. Nachdem Sie auf das benutzerdefinierte Callout geklickt haben, wird das Callout ausgeblendet, aber die Methode "regionDidChangeAnimated delegate" wird danach überhaupt nicht mehr aufgerufen.

Ich vermisse ich etwas? Ich kann die Karte wie gewohnt verschieben, aber sie wird diese Delegiertenmethode nicht aufrufen. Aber wenn ein Zoom-In oder -Out ausgeführt wird, wird es aufgerufen.

Vor dem Hinzufügen eines benutzerdefinierten CallOut für die AnnotationViews, die ich platziere, ist dies nie passiert.

Danke im Voraus.

Grüße, Alan //

+0

Wir haben tatsächlich herausgefunden, dass dies auf dem ursprünglichen Projekt geschieht, das jeder als Vorlage auf dem iOS 5.1-Emulator verwendet, also ist es nicht mein Code. Ich werde versuchen, didSelectView durch Beobachter zu ersetzen und zu sehen, was passiert. –

+0

Ich bekomme dieses Problem auch, es scheint zu auftreten, wenn Sie auf den Stift klicken und halten, während Sie einen neuen Satz von Pins laden. – ThePower

Antwort

2

heruntergeladen ich die XCode-Projekt aus dem Link, den Sie erwähnt und war in der Lage, den Fehler zu reproduzieren. Die folgende Antwort hat eine Abhilfe, die für mich gearbeitet

MKMapView Not Calling regionDidChangeAnimated on Pan

Zur Vereinfachung ich die Lösung wiederholt werden soll und wie ich es in dem genannten Projekt

angewandt

In CustomCalloutViewController.h hinzufügen UIGestureRecognizerDelegate

@interface CustomCalloutViewController : UIViewController 
<MKMapViewDelegate, UIGestureRecognizerDelegate> 

In CustomCalloutViewController.m in Methode viewDidLoad hinzufügen vor [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]; 
} 

Dann noch CustomCalloutViewController.m in den folgenden

#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; 
} 

Bearbeiten hinzufügen: ich gefunden habe, eine andere Abhilfe here (alle am unteren Rand nach unten die obige Abhilfe erwähnt wird, auch). Ich habe es nicht probiert, klingt aber vielversprechend. Ich wiederhole es hier:

Meine Abhilfe ist einfach: In Ihrem View-Controller, erstellen Sie die MKMapView in viewDidAppear :, und zerstören es in viewDidDisappear :. Mir ist klar, dass dies keine freundliche Problemumgehung für diejenigen ist, die den Interface Builder verwenden, aber meiner Meinung nach ist dies der sauberste und wahrscheinlich der beste Weg, Speicher in Ihrer App zu sparen.

Verwandte Themen