MKAnnotationView - 锁定自定义注释视图以固定位置更新

时间:2011-06-17 23:58:06

标签: iphone objective-c mapkit mkmapview mkannotationview

更新#5 我猜这是赏金时间。即使使用我发布的代码示例,也有100多个视图并且没有人被刺穿。一些声望点怎么样!

更新#4 这是一个非常复杂的问题,所以我创建了一个新的基于标签的项目,其中包含我的应用程序的部分,我在这里遇到了麻烦。您可以从以下网址下载:http://www.servinitup.net/CustomCalloutAnnotation.zip 随意打开它(需要添加自己的捆绑包标识符以在手机上运行它)并使用它,并查看是否可以使用该引脚移动该darned标注注释!

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

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

更新#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标准,并有自定义标注注释轨道和引脚。

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

/* core location broadcasts a notification, and my view controller listens to that notification and calls locationManagerDidFindLocation */
- (void)locationManagerDidFindLocation:(NSNotification *)notif {
    CLLocation *location = [notif.userInfo objectForKey:@"location"];
    CLLocationCoordinate2D coords = [location coordinate];
    MKCoordinateSpan span = MKCoordinateSpanMake((5/69), (5/69));
    MKCoordinateRegion region = {coords, span};

    // if we don't have a current location yet, create one, place it on the map, and adjust the map's region
    // otherwise, update the annotation placement and map position in a smooth animation
    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 animated:true];
        [self.mapView regionThatFits:region];
    } else {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.45];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

            // this moves my annotation view perfectly
            self.currentLocationAnnotation.coordinate = coords;

            // ******* this is where my problem is
            // ******* this custom callout annotation view stays
            // ******* in it's original place, even though it's
            // ******* parent annotation view is moving around the screen
            self.calloutAnnotation.coordinate = coords;

            [self.mapView setRegion:region animated:true];
            [self.mapView regionThatFits:region];
        [UIView commitAnimations];
    }
}

3 个答案:

答案 0 :(得分:32)

custom callout

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

https://github.com/jacobjennings/JJMapCallout

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

干杯。