30

更新#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 提交动画];
    }
}
4

3 回答 3

33

自定义标注

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

https://github.com/jacobjennings/JJMapCallout

于 2011-09-09T15:19:05.890 回答
2

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

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

干杯。

于 2011-11-13T23:28:10.027 回答
2

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

于 2011-06-26T00:34:11.843 回答