- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个位置感知应用程序,它使用 MKMapView 和作为 MKAnnotationView 子类实现的自定义标注气泡。昨天我在未显示自定义注释 View 时遇到了一个微妙的错误。在稍微调查了这个问题之后,我得出了以下结果:
在我的自定义注释 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 放入 CalloutAnnotationView
的 didMoveToSuperView
中,发现 在 添加 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/
我正在尝试从一个 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 map 的 m
我是 Haskell 的新手,我认为函数 map map和 map.map在 Haskell 中是一样的。 我的终端给了我两种不同的类型, (map.map) :: (a -> b) -> [[a]
我的目标是创建一个 map 的 map ,这样我就可以通过它的键检索外部 map 的信息,然后通过它们的键访问它的“内部” map 。 但是,当我得到每个内部映射时,我最初创建的映射变成了一个对象,我
如何使用 Java8 编写以下代码? for (Entry> entry : data.entrySet()) { Map value = entry.getValue(); if (valu
我有覆盖整个南非的图片。它们为Tiff格式,并已将坐标嵌入其中。我正在尝试拍摄这些图像(大约20张图像),并将它们用作我的iPhone应用程序中的地图叠加层。我的问题在于(准确地)将地图切成图块。 我
所以我有 2 std::map s >一个是“旧的”,一个是“新的”,我想知道哪些文件被删除了,这样就能够遍历差异并对 shared_ptr 做一些事情。这样的事情可能吗?如何做到? 最佳答案 虽然
是否可以将当前查看的 google.maps.Map 转换为静态图像链接,以便我可以获取图像并将其嵌入到 PDF 中? 我在 map 上添加了一些带有自定义图标的标记,所以我不确定这是否真的可行。 如
你能帮我吗 Java Streams ? 从标题可以看出我需要合并List>>进入Map> . 列表表示为List>>看起来像: [ { "USER_1":{
对于 idAndTags 的第二个条目,内部映射被打乱,但第一个条目则不然 第一次接近! for (Map.Entry> entryOne : idAndTags.entrySet()) {
我将从我的代码开始,因为它应该更容易理解我想要做什么: @function get-color($color, $lightness) { @return map-get(map-get($col
我过去曾在许多网站上使用过 Google map ,但遇到了以前从未遇到过的问题。 map 窗口正在显示,但它只显示左上角的 map 片段,以及之后的任何内容(即使我在周围导航时),右侧也不会加载任何
众所周知,这些 map ,无论是常规街道 map 还是卫星 map ,在中国的特定地区都无法正确排列。那么哪个 map 排列正确,是卫星 map 还是默认街道 map ?一些网站表明卫星 map 是正
在拖尾事件之后,我面临着获取此处 map 中的 map 边界的问题。我需要新的经纬度来在新更改的视口(viewport)中获取一些项目/点。我只是想在拖动结束时获得谷歌地图map.getBounds(
我想做的是通过 ajax API 显示以英国邮政编码为中心的小型 bing 生成 map 。我相信这是可能的;我在 Bing map 文档中找不到如何将英国邮政编码转换为可以插入 map Ajax 控
我有一个 List我想转换成的 e Map>其中外部字符串应为“Name”,内部字符串应为“Domain”。 Name Id Domain e(0) - Emp1, 1, Insuran
我的第 2 部分:https://stackoverflow.com/questions/21780627/c-map-of-maps-typedef-doubts-queries 然后我继续创建 I
是否可以在 1 行中使用 Java8 编写以下所有 null 和空字符串检查? Map> data = new HashMap<>(holdings.rowMap()); Set>> entrySet
我正在审查一个项目的旧代码,并使用 Map 的 Map 的 Map 获得了如下数据结构(3 层 map ): // data structure Map>>> tagTree
这可能是一种不好的做法,但我还没有找到更好的解决方案来解决我的问题。所以我有这张 map // Map>> private Map>> properties; 我想初始化它,这样我就不会得到 Null
我们在 JDK 1.7 中使用 HashMap,我在使用 SonarQube 进行代码审查时遇到了一些问题。 请考虑以下示例: public class SerializationTest imple
我是一名优秀的程序员,十分优秀!