在启动时可靠地选择 MKMapView 中的注释(在 ios 6 和 ios 5.1 中)?

Posted

技术标签:

【中文标题】在启动时可靠地选择 MKMapView 中的注释(在 ios 6 和 ios 5.1 中)?【英文标题】:Reliably selecting an annotion in MKMapView on start (in both ios 6 and ios 5.1)? 【发布时间】:2012-10-16 09:20:43 【问题描述】:

我想从一个事件的详细视图转到 MapViewController,放大注释,然后打开它的标注。 以下是一些相关代码:

@interface MapViewController : UIViewController<MKMapViewDelegate>
...
- (void) viewWillAppear:(BOOL)animated

  [self displayAnnotations];


- (void) viewDidAppear:(BOOL)animated

    ...
    // Zoom in to event
    [map setRegion:region animated:YES];        


- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

   ...
   regionAnimationEnded = YES;
   [self selectAnnotation:a];
   ...


- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views

   ...
   // check to see if the right view is in the array
   ...
   annotationViewDidAppear = YES;
   [self selectAnnotation:a];
   ...   


- (void) selectAnnotation:(id<MKAnnotation>)annotation

   if(annotationViewDidAppear && regionAnimationEnded)
   
     if(!openedAnnotationFirstTime)
     
        [map selectAnnotation:annotation animated:YES];
        openedAnnotationFirstTime = YES;
     
   

这适用于 ios 6 模拟器,但在 ios 5.1 模拟器(和设备上)上,注释视图不可见,如文档中所述:

(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views 调用此方法时,指定的视图已添加到地图中。

所以这取决于哪个先完成:如果区域更改动画最后完成并且注释视图已经出现,则它有效,否则无效。 任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您的selectAnnotation: 方法被调用了两次。尝试只调用一次,在 mapView:regionDidChangeAnimated: 委托方法中。

【讨论】:

实际的 [map selectAnnotation: animated:] 仅在两个标志都设置为 YES 后调用一次 您的班级自己的 selectAnnotation: 方法似乎在两个 MKMapViewDelegate 方法中都被调用。最好将其保留在 mapView:regionDidChangeAnimated: 委托方法中,因为根据您的代码应该最后调用它。【参考方案2】:

我最终在实际 [map selectAnnotation:annotation animated:YES] 上使用了带有延迟的执行选择器; 这是一种变通方法,但似乎效果很好。

【讨论】:

有时是这样,但问题是它取决于设备的性能,所以仍然可能失败。

以上是关于在启动时可靠地选择 MKMapView 中的注释(在 ios 6 和 ios 5.1 中)?的主要内容,如果未能解决你的问题,请参考以下文章

MKMapView 注释取消选择策略

MKMapView 注释第二次不可选择

对 MKMapView 中的注释执行操作时泄漏

从另一个视图中的 MKMapView 中删除注释

Swift MKMapView 引脚注释问题

MKMapView 选择注解