gpt4 book ai didi

iphone - 设置 map View 中心坐标后,自定义注释 View 将从其 super View 中删除

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:28 26 4
gpt4 key购买 nike

我正在开发一个位置感知应用程序,它使用 MKMapView 和作为 MKAnnotationView 子类实现的自定义标注气泡。昨天我在未显示自定义注释 View 时遇到了一个微妙的错误。在稍微调查了这个问题之后,我得出了以下结果:

  • 仅当我尝试在使用捏合手势缩放后立即显示自定义注释 View 时,才会出现此问题。因此,例如,如果您捏合然后平移 map View ,一切正常。以编程方式更改 map 缩放比例也不会导致出现此问题
  • 在我的自定义注释 View 类的 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 是我的自定义注释 View 类。 adjustMapRegionIfNeeded 方法在注释太靠近 map 边界时调整 map View 的中心坐标,这反过来会导致从其父 View 中删除 CalloutMapAnnotationView 实例。为什么会发生这种情况,解决方法是什么?

进一步的调查显示了更奇怪的行为。我在 adjustMapRegionIfNeeded 中添加了一堆调试 NSLogs 来打印每个注释可见性并得出以下结果:

正常情况(显示自定义注解):

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], @"?!");

最佳答案

我遇到过同样的问题(很可能使用了与您相同的教程)。

我已将一些 NSLog 放入 CalloutAnnotationViewdidMoveToSuperView 中,发现 添加 CalloutAnnotationView 后,它的 super View ,MKAnnotationContainerView 的一个实例,正在被释放。这可能意味着 MKMapView 在放大或缩小时会在内部重新创建其 MKAnnotationContainerView

我所做的是在添加它之后做一些检查:

[self.mapView addAnnotation: m_calloutAnnotation];
[self performSelector: @selector(checkCalloutAnnotationVisibility)
withObject: nil
afterDelay: 0.15];
...

- (void) checkCalloutAnnotationVisibility
{
if (!m_calloutAnnotationView.window)
{
[self.mapView removeAnnotation: m_calloutAnnotation];
[self.mapView addAnnotation: m_calloutAnnotation];

[self performSelector: @selector(checkCalloutAnnotationVisibility)
withObject: nil
afterDelay: 0.1];
}
}

...

- (void) mapView: (MKMapView *) mapView
didDeselectAnnotationView: (MKAnnotationView *) view
{
[NSObject cancelPreviousPerformRequestsWithTarget: self
selector:
@selector(checkCalloutAnnotationVisibility)
object: nil];
...
}

这很老套,是的。如果您找到更好的解决方案,请发布。 :)

关于iphone - 设置 map View 中心坐标后,自定义注释 View 将从其 super View 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6858569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com