2012-06-09 12 views
6

sto implementando un MKAnnotationView richiamo personalizzato con il codice spiegato qui è selezionata (di Jacob uno), che in realtà pone un altro AnnotationView personalizzato come nota:MKMapKit regionDidChangeAnimated si ferma dopo avere toccato richiamo personalizzato

MKAnnotationView - Lock custom annotation view to pin on location updates

Tutto funziona bene, ma ho un comportamento strano. Dopo aver toccato il callout personalizzato, verrà ignorata la didascalia, ma in seguito il metodo delegato regionDidChangeAnimated non verrà più richiamato.

Mi manca qualcosa? Posso spostare la mappa come al solito, ma non chiamerò quel metodo delegato. Anche se si fa uno zoom in avanti o indietro, viene chiamato.

Prima di aggiungere un CallOut personalizzato per l'AnnotationView che sto posizionando, questo non è mai accaduto.

Thx in anticipo.

saluti, Alan //

+0

In realtà ho scoperto che questo accade sul progetto originale che tutti utilizzano come modello sull'emulatore iOS 5.1, quindi non è il mio codice. Proverò a sostituire il didSelectView con gli osservatori e vedere cosa succede. –

+0

Anche questo problema si verifica, sembra che si verifichi quando si fa clic sul pin e si tiene premuto mentre si carica un nuovo set di pin. – ThePower

risposta

2

Ho scaricato il progetto XCode dal link che lei ha citato e stato in grado di riprodurre l'errore. La risposta seguente è una soluzione che ha funzionato per me

MKMapView Not Calling regionDidChangeAnimated on Pan

Per comodità voglio ripetere la soluzione e come ho applicato al progetto di cui

In CustomCalloutViewController.h aggiungere UIGestureRecognizerDelegate

@interface CustomCalloutViewController : UIViewController 
<MKMapViewDelegate, UIGestureRecognizerDelegate> 

in CustomCalloutViewController.m nel metodo viewDidLoad add prima [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]; 
} 

Poi ancora nel CustomCalloutViewController.m aggiungere il seguente

#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: ho trovato un'altra soluzione here (tutti giù in fondo la soluzione precedente è menzionato, anche). Non ho provato, ma sembra promettente. Ripeto qui:

La mia soluzione è semplice: Nel tuo controller della vista, creare il MKMapView in viewDidAppear :, e distruggerlo in viewDidDisappear :. Mi rendo conto che questa soluzione non è amichevole per chi utilizza Interface Builder, ma, a mio avviso, è il modo più pulito e probabilmente il modo migliore per risparmiare memoria nella tua app.

Problemi correlati