自定义标注气泡 MKMapView

Posted

技术标签:

【中文标题】自定义标注气泡 MKMapView【英文标题】:Customized callout bubble MKMapView 【发布时间】:2011-07-24 15:34:54 【问题描述】:

我想要做的是在 MKMapView 中创建一个自定义标注气泡,正如 http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/ 中所解释的那样,但似乎在那个做得很好的应用程序中存在一些错误。例如,当您让自定义标注气泡保持打开状态并滚动离开时,地图会在某个时候滚动回打开的标注。缩放有时也会触发此错误。有没有人能够解决这些问题?很抱歉创建了一个新问题(因为有几个解决自定义标注气泡),但我没有足够的代表点来评论答案。

【问题讨论】:

该示例中是否有应该关闭标注但没有关闭的代码?也许您可以在这里提供相关的摘录,我们可以尝试看看它为什么不起作用。 我认为任何代码都不应该关闭它(在模仿苹果行为时),除非它们在它变得可见时再次打开它,也许你是这个意思? 这绝对是一个错误。我已经使用这段代码一段时间了,但从未遇到过这种情况。基本上,如果您将标注气泡滚动到视图之外,然后点击地图,它会认为您正在点击注释并且标注未显示,因此它正在重新调整屏幕以便显示标注。得在这方面工作一段时间。感谢您发现错误。 【参考方案1】:

在 CalloutMapAnnotationView 中解决了这个问题:didMoveToSuperview, 如果我们取消选择注解,那么不要调用adjustMapRegionIfNeeded。

所以我修复它的方法是在我的 mapViewController 中:didDeselectAnnotationView,我在从 mapView 中删除注释之前为 BasicMapAnnotationView 分配了一个非零标记值。我选择了 159。

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 

// distinguish between the map deselecting this and the user tapping on the callout.
//   in the former case, we want to deselect as normal; latter case, show coupon detail.

if ( [view isKindOfClass:[BasicMapAnnotationView class]] ) 
    if ( ((BasicMapAnnotationView *)view).calloutMapAnnotation ) 
        if ( !((BasicMapAnnotationView *)view).preventSelectionChange) 
            ((BasicMapAnnotationView *)view).tag = 159;  // prevent adjusting map - see CalloutMapAnnotationView
            [mapView removeAnnotation: ((BasicMapAnnotationView *)view).calloutMapAnnotation];
            // if we're deselecting the currently selected one, null out self.selectedAnnotationView
            // Otherwise, the map view is deselecting this one in order to select another one
            // and the timing is such that this nulling happens first, and the newly set AV would have no value for this.
            if ( (BasicMapAnnotationView *)view == self.selectedAnnotationView ) 
                self.selectedAnnotationView=nil;
            
            ((BasicMapAnnotationView *)view).calloutMapAnnotation = nil;
        
    


然后,在 CalloutMapAnnotationView 中,我检查这个值,如果找到,我不调整地图。

- (void)didMoveToSuperview 
if ( self.parentAnnotationView ) 
    if ( self.parentAnnotationView.superview )    
        // null superview means it's been removed from map, and adjustMap gets wrong parentOrigin based on null superview,
        // and recenters the map somewhere in Antarctica.  The Ross Ice Shelf has no coupons except for frozen penguin eggs.

        if ( self.parentAnnotationView.tag != 159 ) // Don't adjust map region on deselect. 
                                                     //159 hardcoded in MapViewController:didDeselectAnnotationView
            [self adjustMapRegionIfNeeded];
        
        [self animateIn];
     


【讨论】:

BasicMapAnnotationView 没有属性 calloutMapAnnotation,并且添加它并没有太大的好处,因为它没有分配任何值(除了 nil,尽管目前无法达到)。也许我错过了什么? 你能提供整个代码吗?除非我完全错过了什么,否则在第 1 部分和第 2 部分中,calloutMapAnnotation 都没有给出任何合理的值。我尝试了您这样添加的内容,但它们不起作用,我猜 calloutMapAnnotation 属性是罪魁祸首。

以上是关于自定义标注气泡 MKMapView的主要内容,如果未能解决你的问题,请参考以下文章

ios中Mkmapview中的自定义标注

自定义 iOS8 标注气泡 (Swift)

MKMapView 在 iOS 4 中忽略 centerOffset 的更新

在具有“弹出”效果的 MKMapView 中为 MKAnnotationView 设置动画自定义标注

如何在地图视图中添加自定义标注视图

添加注释后选择带有自定义标注的 MKMarkerAnnotationView