Ala*_*edy 6 objective-c mapkit mkannotationview ios
我正在使用这里解释的代码(Jacob的一个)实现一个自定义的MKAnnotationView标注,它实际上放置了另一个Custom AnnotationView,因为选择了Annotation:
MKAnnotationView - 锁定自定义注释视图以固定位置更新
一切都很好,但我有一些奇怪的行为.点击自定义标注后,它将关闭标注,但之后会停止调用regionDidChangeAnimated委托方法.
我错过了什么?我可以照常平移地图,但它不会调用该委托方法.虽然如果放大或缩小它会被调用.
在为我正在放置的AnnotationView添加自定义CallOut之前,这种情况从未发生过.
Thx提前.
此致,艾伦//
我从您提到的链接下载了 XCode 项目,并且能够重现该错误。以下答案有一个对我有用的解决方法
MKMapView 未在平移上调用 RegionDidChangeAnimated
为了方便起见,我想重复一下该解决方案以及我如何在上述项目中应用它
在CustomCalloutViewController.h添加UIGestureRecognizerDelegate
@interface CustomCalloutViewController : UIViewController
<MKMapViewDelegate, UIGestureRecognizerDelegate>
Run Code Online (Sandbox Code Playgroud)
在CustomCalloutViewController.m方法中viewDidLoad添加之前[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];
}
Run Code Online (Sandbox Code Playgroud)
然后仍然在CustomCalloutViewController.m添加以下内容
#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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:我在这里找到了另一种解决方法(所有内容都在底部,也提到了上述解决方法)。我没有尝试,但听起来很有希望。我在这里重复一遍:
我的解决方法很简单:在视图控制器中,在 viewDidAppear: 中创建 MKMapView,并在 viewDidDisappear: 中销毁它。我意识到这对于那些使用 Interface Builder 的人来说不是一个友好的解决方法,但是,在我看来,这是最干净的,而且可能是在应用程序中节省内存的最佳方法。