2012-06-09 15 views
6

mam realizacji niestandardowego MKAnnotationView objaśnienie z kodem wyjaśnione tutaj wybrano (Jacob jeden), które faktycznie stawia kolejny niestandardowy AnnotationView jak adnotacją:MKMapKit regionDidChangeAnimated zatrzymuje się po dotknięciu niestandardowych objaśnienie

MKAnnotationView - Lock custom annotation view to pin on location updates

Wszystko działa dobrze, ale mam dziwne zachowanie. Po dotknięciu niestandardowego objaśnienia, odrzuci objaśnienie, ale metoda delegata regionuDidChangeAnimated w ogóle przestanie być wywoływana.

Brakuje mi czegoś? Mogę przesuwać mapę jak zwykle, ale nie wywołaj tej metody delegowania. Jednak jeśli zrobi się zbliżenie lub oddalenie, to zostanie wywołane.

Przed dodaniem niestandardowego CallOut do umieszczania AnnotationView, nigdy tak się nie stało.

Thx z góry.

Pozdrawiam, Alan //

+0

W rzeczywistości odkryłem, że dzieje się to w oryginalnym projekcie, którego wszyscy używają jako szablonu na emulatorze iOS 5.1, więc to nie mój kod. Spróbuję zastąpić didSelectView obserwatorami i zobaczyć, co się stanie. –

+0

Otrzymuję również ten problem, wydaje się, że występuje po kliknięciu pin i przytrzymując podczas ładowania nowego zestawu pinów. – ThePower

Odpowiedz

2

Pobrałem projektu Xcode od wspomnianego linku i był w stanie odtworzyć błędu. Poniższa odpowiedź ma obejścia, który pracował dla mnie

MKMapView Not Calling regionDidChangeAnimated on Pan

Dla wygody Chcę powtórzyć rozwiązanie i jak zastosować je we wspomnianym projekcie

W CustomCalloutViewController.h dodać UIGestureRecognizerDelegate

@interface CustomCalloutViewController : UIViewController 
<MKMapViewDelegate, UIGestureRecognizerDelegate> 

W CustomCalloutViewController.m w metodzie viewDidLoad dodaj przed [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]; 
} 

Potem jeszcze w CustomCalloutViewController.m dodać następujące

#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: Znalazłem inną obejście here (wszystko na dole jest obejście wyżej wspomniano, zbyt). Nie próbowałem, ale brzmi obiecująco. Powtarzam to tutaj:

Moje obejście jest proste: w kontrolce widoku utwórz MKMapView w viewDidAppear :, i zniszcz go w viewDidDisappear :. Rozumiem, że nie jest to przyjazne obejście dla osób korzystających z narzędzia do tworzenia interfejsów, ale moim zdaniem jest to najczystszy i prawdopodobnie najlepszy sposób na oszczędzanie pamięci w aplikacji.

Powiązane problemy