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.
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. –
Otrzymuję również ten problem, wydaje się, że występuje po kliknięciu pin i przytrzymując podczas ładowania nowego zestawu pinów. – ThePower