【问题标题】:MKAnnotationView - Lock custom annotation view to pin on location updatesMKAnnotationView - 锁定自定义注释视图以固定位置更新
【发布时间】:2011-09-17 14:05:56
【问题描述】:

更新 #5 我想现在是赏金时间。超过 100 次浏览,没有人被戳中,即使是我发布的代码示例。一些声望点怎么样!

更新 #4这是一个非常复杂的问题,因此我创建了一个基于标签的新项目,其中仅包含我在此处遇到问题的应用程序部分。下载地址:http://www.servinitup.net/CustomCalloutAnnotation.zip 随意打开它(需要添加你自己的包标识符才能在手机上运行它)并尝试使用它,看看你是否可以让那个该死的标注注释随着图钉移动!

更新 #3 尝试将 setAnnotation 设为教程的 CalloutMapAnnotationView 的公共方法并直接调用它。没有运气。尽管发生了一些奇怪的事情,但唯一移动的是标注的小三角形部分。我无法让整个标注移动。

更新 #2 运气不佳,但现在一直在寻找以编程方式创建“捏缩放”然后立即撤消它的方法,因此用户永远看不到变化。希望以编程方式执行此操作与手动执行此操作具有相同的效果,并且标注注释将弹回其父级。有什么想法吗?

更新 #1 在玩了这里之后,我得到了: - 将 self.calloutAnnotation.coordinate = coords; 替换为 self.calloutAnnotation.latitude = coords.latitude;self.calloutAnnotation.longitude = coords.longitude; - 更改后,如果我在图钉更新后稍微捏地图以放大或缩小,标注注释将动画到正确的位置,就在图钉上方。

所以现在我需要弄清楚如何在不让用户实际捏住缩放的情况下实现这一点。


原帖

我和其他 SO 用户正在使用这个很棒的解决方案来创建自定义标注注释: http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/

当您使用标准标注 (annotationview.canShowCallout = true) 并且大头针随着位置的更新而在屏幕上移动时,标准标注会与大头针一起移动,就好像它们被锁定在一起一样。

使用上面的自定义标注解决方案时,当我的图钉在位置更新后四处移动时,标注注释会停留在其原始位置。当然,我想模仿 iOS 标准,并让自定义标注注释跟踪与 pin 一起。

这是我到目前为止的代码,它成功地移动了注释视图,但不是自定义标注注释视图:

/* 核心位置广播一个通知,我的视图控制器监听该通知并调用 locationManagerDidFindLocation */ - (void)locationManagerDidFindLocation:(NSNotification *)notif { CLLocation *location = [notif.userInfo objectForKey:@"location"]; CLLocationCoordinate2D coords = [位置坐标]; MKCoordinateSpan 跨度 = MKCoordinateSpanMake((5/69), (5/69)); MKCoordinateRegion 区域 = {坐标,跨度}; // 如果我们还没有当前位置,则创建一个,将其放置在地图上,并调整地图的区域 // 否则,在平滑动画中更新注释位置和地图位置 if (self.currentLocationAnnotation == nil) { self.currentLocationAnnotation = [[CurrentLocationAnnotation alloc] initWithCoordinate:coords andTitle:@"My Title" andSubtitle:@"My subtitle"]; [self.mapView addAnnotation:self.currentLocationAnnotation]; [self.mapView setRegion:region Animation:true]; [self.mapView regionThatFits:region]; } 别的 { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.45]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; // 这完美地移动了我的注释视图 self.currentLocationAnnotation.coordinate = 坐标; // ******* 这是我的问题所在 // ******* 这个自定义标注注释视图保持不变 // ******* 在它原来的地方,即使它是 // ******* 父注释视图正在屏幕上移动 self.calloutAnnotation.coordinate = 坐标; [self.mapView setRegion:region Animation:true]; [self.mapView regionThatFits:region]; [UIView 提交动画]; } }

【问题讨论】:

  • @JARinteractive - 我认为您是常驻专家,因为您撰写了我正在关注的博客文章。你有什么想法吗?
  • 您链接到的项目缺少几个 PNG、map_marker 和 map_marker@2x。你能包括和更换拉链吗?此外,当我感到沮丧时,你的 setAnnotation... 方法的命名让我对我的方法命名感觉更好。
  • 哈!我想我忘了清理它。是的,绝对是我在拔掉头发五天后采用的命名约定。我刚刚添加了 .png 并重新上传。看看,谢谢你给这个看看!
  • 示例代码的链接对我不起作用。有镜子吗?
  • 查看您的代码,我认为问题可能出在您处理位置的方式上。在开始时执行代码,它给出了 19 次相同的位置,之后再也没有。为什么不使用 CoreLocation 而不是 NSNotificationCenter?

标签: iphone objective-c mapkit mkmapview mkannotationview


【解决方案1】:

我根据您的 CalloutMapAnnotationView 创建了一个项目,演示了一个基于 IB 的解决方案。箭头键动画位置注释的运动和它的标注注释。标注现在还根据提供的 contentView 自动调整大小,并且视图是从单独的 nib 加载的。祝你好运!

https://github.com/jacobjennings/JJMapCallout

【讨论】:

  • 感谢 Jacob,您的代码是我看到的第一个从 .xib 加载的自定义标注的示例。很好的答案。
  • 哦,哇,megaupload 的删除影响了我个人。今晚我清理一下,放到github什么的。
  • 先生,我添加了一些关于 pin click 如何添加的详细信息
  • 我无法在我的项目中实现此代码,谁能帮助我
【解决方案2】:

我知道你不会喜欢这个答案,但它确实有效。您链接到的示例仅通过最困难的方式(drawRect:) 在叠加层中绘制自定义图像。您是否考虑过将叠加层渲染到 UIImage 中,然后在一个非常简单的 MKAnnotationView 上设置 image 属性?即使您需要定期更改内容,例如更新酒吧的好友数量,您也可以在更改发生时重新绘制图像并更新相应的 MKAnnotationView。

【讨论】:

  • 绝对是解决这个问题的一种方法。我认为@JARinteractive 在drawRect: 中执行所有操作的原因不仅仅是创建图像,是因为指向引脚的箭头需要是动态的。如果大头针位于屏幕左侧,标注注释的箭头将在此处绘制。如果引脚注释位于屏幕右侧,则相同。此外,标准标注的优点之一是,它使用图钉从一个点到另一个点进行动画处理。按照你的方式做意味着我必须在移动之前清除图像,然后让它再次出现。
  • 认为使用带有图像的基础 MKAnnotationView,框架将绘制标注箭头。
【解决方案3】:

我查看了您的代码,我的建议是创建一个新的自定义 MKAnnotationView 并在其上封装两个视图(图钉和标注)。

但是对于您当前的代码,请考虑阅读已批准的回复这个问题:MKMapView moving Annotations Automatically - animate them?

干杯。

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 2011-12-22
    • 2011-10-23
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多