我有一个带注释的地图,我正在执行以下操作:
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view{
[self methodA];}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
[self methodB];}
方法A和B都在mapView.superview中删除或添加视图。
在处理一个注释时,一切正常。 问题是,当我有多个注释时,我会选择两个,一个接一个。
如果我点击地图中的任何其他位置,一切正常。但是当我在第一个注释视图之后点击第二个注释视图时,它会执行" didDeselectAnnotationView"然后" didSelectAnnotationView"它调用方法A和B,这不是我想要的。我希望它检测到我在另一个注释中单击并忽略这两种方法。
我已经研究过这个但尚未找到任何解决方案。
我尝试添加一个全局变量并使用它来识别用户触摸的位置:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch = [touches anyObject];
// Get the specific point that was touched
CGPoint point = [touch locationInView:self.mapView];
for (id<MKAnnotation> annotation in self.mapView.annotations) {
MKAnnotationView* anView = [self.mapView viewForAnnotation: annotation];
if (anView){
CGRect frame = CGRectMake(anView.frame.origin.x-5, anView.frame.origin.y-5, anView.frame.size.width+5, anView.frame.size.height+5);
if ( CGRectContainsPoint(frame, point) ) {
NSLog(@"BELONGS");
}
}
}}
然而,这并没有抓住所有的接触,而且这将是一个意大利面条解决方案。
任何想法如何解决这个问题?
一切顺利
答案 0 :(得分:0)
委托人在取消选择然后选择另一个注释视图的情况和选择新注释视图的情况之间没有区别,而选择了一个注释视图。在这两种情况下,这些调用都将按以下顺序完成:
你想要两件事:
1)当view2的选择与取消选择view1非常接近(及时)时,不调用methodB。
2)当选择与之前的选择接近(及时)时,不调用methodA。
要解决这两个问题,您可以存储两个时间戳:1)最后一个选择2)最后取消选择。使用这两个变量,您可以设置一个阈值来定义&#34;关闭&#34;在上面的两条规则中意味着。
现在你有条件阻止在快速取消选择和选择的特定情况下调用methodA和methodB(当你从一个选择切换到另一个选择时,代理真正发生了这种情况)。
答案 1 :(得分:0)
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)aView
{
indexPathTag=aView.tag;
[mapView deselectAnnotation:aView.annotation animated:YES];
}
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)aView
{
}
从didSelectAnnotationView调用deselectAnnotation。
答案 2 :(得分:0)
这是我目前的解决方案。即使我不喜欢它,它现在也适用。 如果您有更好的答案,请发布答案,我会将其标记为正确答案。
我正在使用全局变量来跟踪当前选定的注释。我把它初始化为零。
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view{
[self performSelector:@selector(numberOfSelectedAnnotations)
withObject:view.annotation afterDelay:.5];
}
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{
if (self.selectedAnnotation == nil) {
[self methodB];
}
self.selectedAnnotation = (MKAnnotationView*)view;
}
-(void)numberOfSelectedAnnotations{
if (self.mapView.selectedAnnotations.count == 0) {
[self methodA];
self.selectedAnnotation = nil;
}
}
答案 3 :(得分:-1)
这是我首选的解决方案:
private var selectedAnnotationView: MKAnnotationView?
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if let _ = annotation as? MKUserLocation {
return nil
}
let ident = "MyAnnotation"
let pin = mapView.dequeueReusableAnnotationViewWithIdentifier(ident) as? MKPinAnnotationView ?? MKPinAnnotationView(annotation: annotation, reuseIdentifier: ident)
pin.animatesDrop = true
pin.canShowCallout = true
pin.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "annotationTapped:"))
pin.rightCalloutAccessoryView = UIButton(type: .InfoDark)
return pin
}
// This will get called before didDeselectAnnotationView below
func annotationTapped(tapGesture: UITapGestureRecognizer) {
if let annotationView = tapGesture.view as? MKAnnotationView {
if annotationView === self.selectedAnnotationView {
// same as last time
} else {
// different annotation view
}
self.selectedAnnotationView = annotationView
// any other logic for handling annotation view tap
}
}
func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) {
if view === self.selectedAnnotationView {
// The user did not select another annotation view
// (e.g. they tapped the map)
self.selectedAnnotationView = nil
}
}