我正在开发一个位置感知应用程序,它使用MKMapView,并将自定义标注气泡实现为MKAnnotationView子类。昨天我在没有显示自定义注释视图时遇到了一个微妙的错误。在仔细研究了这个问题之后,我想出了以下结果:
在我的自定义注释视图类的didMoveToSuperview中设置断点,显示以下回溯:
#0 -[CalloutMapAnnotationView didMoveToSuperview]
#1 0x00186857 in -[UIView(Hierarchy) removeFromSuperview] ()
#2 0x00e14c70 in -[MKAnnotationContainerView _removeAnnotationView:updateCollections:] ()
#3 0x00e196cb in -[MKAnnotationContainerView _removeAnnotationViews:] ()
#4 0x00e19f51 in -[MKAnnotationContainerView _displayAnnotationsInMapRect:includePending:animated:removeOffscreenAnnotations:] ()
#5 0x00e1aaa7 in -[MKAnnotationContainerView _refreshDisplayedAnnotations] ()
#6 0x00dfc508 in -[MKMapView _didChangeRegionMidstream:centerPoint:] ()
#7 0x00e0165c in -[MKMapView _goToCenterCoordinate:zoomLevel:animationType:] ()
#8 0x00df34c3 in -[MKMapView goToCenterCoordinate:zoomLevel:animationType:] ()
#9 0x00e0086f in -[MKMapView setCenterCoordinate:animated:] ()
#10 0x00036fc3 in -[CalloutMapAnnotationView adjustMapRegionIfNeeded]
#11 0x00037c63 in -[CalloutMapAnnotationView didMoveToSuperview]
#12 0x0017f750 in -[UIView(Internal) _addSubview:positioned:relativeTo:] ()
#13 0x0017dc00 in -[UIView(Hierarchy) insertSubview:atIndex:] ()
#14 0x00e2049f in -[MKAnnotationContainerView _addViewForAnnotation:] ()
#15 0x00e199a5 in -[MKAnnotationContainerView _addViewsForAnnotations:animated:] ()
#16 0x00e19f0d in -[MKAnnotationContainerView _displayAnnotationsInMapRect:includePending:animated:removeOffscreenAnnotations:] ()
#17 0x00e1a9e2 in -[MKAnnotationContainerView showAddedAnnotationsAnimated:] ()
这里,CalloutMapAnnotationView是我的自定义注释视图类。如果注释太靠近地图边框,adjustMapRegionIfNeeded
方法会调整地图视图的中心坐标,从而导致从其超级视图中删除CalloutMapAnnotationView实例。为什么会发生这种情况以及解决方法可能是什么?
进一步调查显示更奇怪的行为。我在adjustMapRegionIfNeeded
中添加了一堆调试NSLog来打印每个注释可见性,并得出以下结果:
正常情况(显示自定义注释):
Custom callout annotation location: (55.821350, 37.497490)
Parent annotation location: (55.821350, 37.497490)
Custom callout annotation visibility before adjustment: 1
Custom callout annotation visibility after adjustment: 1
Parent annotation visibility: 1
不会显示自定义注释:
Custom callout annotation location: (55.821350, 37.497490)
Parent annotation location: (55.821350, 37.497490)
Custom callout annotation visibility before adjustment: 1
Custom callout annotation visibility after adjustment: 0
Parent annotation visibility: 1
尽管父注释和自定义标注注释具有相同的位置,但其中一个是可见的,而另一个则不可见。我正在使用以下代码测试注释可见性:
[[self.mapView annotationsInMapRect:self.mapView.visibleMapRect] containsObject:self.annotation]
不仅如此,以下断言失败:
MKMapRect visibleMapRect = self.mapView.visibleMapRect;
MKMapPoint annotationPoint = MKMapPointForCoordinate(self.annotation.coordinate);
NSAssert(MKMapRectContainsPoint(visibleMapRect, annotationPoint) == [[self.mapView annotationsInMapRect:visibleMapRect] containsObject:self.annotation], @"?!");
答案 0 :(得分:1)
我遇到了同样的问题(并且很可能使用了与您相同的教程)。
我已将一些NSLog放入CalloutAnnotationView
didMoveToSuperView
,并发现 之后添加CalloutAnnotationView
,其超级视图,{{{ 1}},正在被释放。这可能意味着MKAnnotationContainerView
在放大或缩小时会在内部重新创建其MKMapView
。
我做的是在添加后稍微检查一下:
MKAnnotationContainerView
非常hacky,是的。如果您找到更好的解决方案,请发布。 :)