Iphone MapView-一次显示一个注释

Iphone MapView-一次显示一个注释,iphone,annotations,android-mapview,Iphone,Annotations,Android Mapview,我目前正在通过一个循环向我的地图添加注释。。。但是注释只以组的形式出现在我的地图上。此外,在加载时,地图上实际上只显示大约4个注释。。。但当我稍微移动地图时,所有应该在那里的注释突然出现 如何将所有注释加载到正确的位置,一次加载一个 提前谢谢 下面是我用来添加注释的代码: NSString *incident; for (incident in weekFeed) { NSString *finalCoordinates = [[NSSt

我目前正在通过一个循环向我的地图添加注释。。。但是注释只以组的形式出现在我的地图上。此外,在加载时,地图上实际上只显示大约4个注释。。。但当我稍微移动地图时,所有应该在那里的注释突然出现

如何将所有注释加载到正确的位置,一次加载一个

提前谢谢

下面是我用来添加注释的代码:

 NSString *incident;
            for (incident in weekFeed) {
                NSString *finalCoordinates = [[NSString alloc] initWithFormat:@"%@", [incident valueForKey:@"coordinates"]];

                NSArray *coordinatesArray = [finalCoordinates componentsSeparatedByString:@","]; 

                latcoord = (@"%@", [coordinatesArray objectAtIndex:0]);
                longcoord = (@"%@", [coordinatesArray objectAtIndex:1]);

                // Final Logs
                NSLog(@"Coordinates in NSString: [%@] - [%@]", latcoord, longcoord);

                CLLocationCoordinate2D coord;
                coord.latitude = [latcoord doubleValue];
                coord.longitude = [longcoord doubleValue];


                DisplayMap *ann = [[DisplayMap alloc] init]; 
                ann.title = [NSString stringWithFormat: @"%@", [incident valueForKey:@"incident_type"]];
                ann.subtitle = [NSString stringWithFormat: @"%@", [incident valueForKey:@"note"]];
                ann.coordinate = coord;

                [mapView addAnnotation:ann];

                [ann release];
                }


// Custom Map Markers
-(MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id <MKAnnotation>)annotation {

    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;  //return nil to use default blue dot view

    static NSString *AnnotationViewID = @"annotationViewID";
    MKAnnotationView *annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];

    if (annotationView == nil) {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationViewID] autorelease];
        }

    annotationView.canShowCallout = YES;

    if ([annotationView.annotation.title isEqualToString:@"one"]) {
        UIImage *pinImage = [UIImage imageNamed:@"marker_1.png"];
        [annotationView setImage:pinImage];
        }

    if ([annotationView.annotation.title isEqualToString:@"two"]) {
        UIImage *pinImage = [UIImage imageNamed:@"marker_2.png"];
        [annotationView setImage:pinImage];
        }

    annotationView.annotation = annotation;
    return annotationView;
    }

- (void) mapView:(MKMapView *)mapV didAddAnnotationViews:(NSArray *)views {
    CGRect visibleRect = [mapV annotationVisibleRect]; 
    for (MKAnnotationView *view in views) {
        CGRect endFrame = view.frame;

        CGRect startFrame = endFrame; startFrame.origin.y = visibleRect.origin.y - startFrame.size.height;
        view.frame = startFrame;

        [UIView beginAnimations:@"drop" context:NULL]; 
        [UIView setAnimationDuration:0.4];

        view.frame = endFrame;

        [UIView commitAnimations];
    }
}
NSString*事件;
对于(weekFeed中的事件){
NSString*finalCoordinates=[[NSString alloc]initWithFormat:@“%@,[incident valueForKey:@“coordinates”];
NSArray*坐标Array=[最终坐标组件由字符串分隔:@“,”];
latcoord=(@“%@,[CoordinateArray objectAtIndex:0]);
longcoord=(@“%@,[CoordinateArray对象索引:1]);
//最终日志
NSLog(@“NSString中的坐标:[%@]-[%@]”,拉特库德,朗格德);
CLLocationCoordinate2D coord;
坐标纬度=[latcoord doubleValue];
坐标经度=[longcoord doubleValue];
DisplayMap*ann=[[DisplayMap alloc]init];
ann.title=[NSString stringWithFormat:@“%@”,[incident valueForKey:@“incident_type”];
ann.subtitle=[NSString stringWithFormat:@“%@”,[incident valueForKey:@“note”];
ann.coordinate=coord;
[地图视图添加注释:ann];
[安发布];
}
//自定义地图标记
-(MKAnnotationView*)地图视图:(MKMapView*)地图视图注释:(id)注释{
if([annotation isKindOfClass:[MKUserLocation类]])
return nil;//返回nil以使用默认的蓝点视图
静态NSString*AnnotationViewID=@“AnnotationViewID”;
MKAnnotationView*annotationView=(MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationViewID];
如果(注释视图==nil){
annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation重用标识符:AnnotationViewID]自动释放];
}
annotationView.canShowCallout=是;
如果([annotationView.annotation.title isEqualToString:@“一个”]){
UIImage*pinImage=[UIImage ImageName:@“marker_1.png”];
[注释视图集图像:pinImage];
}
如果([annotationView.annotation.title isEqualToString:@“两个”]){
UIImage*pinImage=[UIImage ImageName:@“marker_2.png”];
[注释视图集图像:pinImage];
}
annotationView.annotation=注释;
返回注释视图;
}
-(void)mapView:(MKMapView*)mapV DiDaddAnnotationView:(NSArray*)视图{
CGRect visibleRect=[mapV注释visibleRect];
用于(MKAnnotationView*视图中的视图){
CGRect endFrame=view.frame;
CGRect startFrame=endFrame;startFrame.origin.y=visibleRect.origin.y-startFrame.size.height;
view.frame=开始帧;
[UIView beginAnimations:@“drop”上下文:NULL];
[UIView设置动画持续时间:0.4];
view.frame=endFrame;
[UIView委员会];
}
}

添加每个注释后,您需要暂停更新,并允许地图有时间刷新。

这个解决方案有点凌乱,因为我不得不大嚼我当前的一个项目来测试,但希望这能对你有用

首先解释一下,将数据与UI表示分离是至关重要的。[MKMapView addAnnotation]只是对MKMapView的数据更新,对动画或计时没有直接影响

委托方法mapView:didAddAnnotationViews:是所有自定义表示行为的定义位置。在您的描述中,您不希望这些内容同时出现,因此您需要对动画进行排序,而不是同时执行它们

一种方法是一次添加所有注释,然后随着动画延迟的增加而添加它们,但是无论出于何种原因添加的新注释将再次在零开始其动画

下面的方法设置动画队列self.pendingViewsForAnimation(NSMutableArray),以在添加注释视图时保存注释视图,然后按顺序链接动画

我已经用alpha替换了帧动画,将重点放在动画问题上,以将其与某些项目未出现的问题分开。更多关于这个代码后

// Interface
// ...

// Add property or iVar for pendingViewsForAnimation; you must init/dealloc the array
@property (retain) NSMutableArray* pendingViewsForAnimation;

// Implementation
// ...
- (void)processPendingViewsForAnimation
{
    static BOOL runningAnimations = NO;
    // Nothing to animate, exit
    if ([self.pendingViewsForAnimation count]==0) return;
    // Already animating, exit
    if (runningAnimations) 
        return;

    // We're animating
    runningAnimations = YES;

    MKAnnotationView* view = [self.pendingViewsForAnimation lastObject];

    [UIView animateWithDuration:0.4 animations:^(void) {
        view.alpha = 1;
        NSLog(@"Show Annotation[%d] %@",[self.pendingViewsForAnimation count],view);
    } completion:^(BOOL finished) {
        [self.pendingViewsForAnimation removeObject:view];
        runningAnimations = NO;
        [self processPendingViewsForAnimation];
    }];

}

// This just demonstrates the animation logic, I've removed the "frame" animation for now
// to focus our attention on just the animation.    
- (void) mapView:(MKMapView *)mapV didAddAnnotationViews:(NSArray *)views {
    for (MKAnnotationView *view in views) {
        view.alpha = 0;

        [self.pendingViewsForAnimation addObject:view];
    }
    [self processPendingViewsForAnimation];
}
关于第二个问题,在移动地图之前,项目不会始终显示。我看不到您的代码中有任何明显的错误,但以下是我将采取的一些措施来隔离问题:

  • 临时删除mapView:DidAddAnnotationView:、mapView:annotationForView:和任何其他自定义行为,以查看默认行为是否有效
  • 验证addAnnotation:调用中是否有有效的注释,以及坐标是否可见(使用[mapView visibleMapRect]、MKMapRectContainsPoint()和MKMapPointForCoordinate()
  • 如果它仍然不起作用,请查看调用“添加注释”代码的位置。我尝试使用performSelector:withObject:afterDelay避免在地图移动期间进行注释调用。您可以在这之前使用[NSObject cancelPreviousPerformRequestsWithTarget:selector:object:]在加载注释之前创建一个稍微的延迟,以防地图被多次滑动移动了很长的距离
  • 最后一点,要实现您正在寻找的管脚下降效果,您可能希望从原始对象偏移一个固定距离,而不是依赖于annotationVisibleRect。您当前的实现将导致管脚根据其与边缘的距离以不同的速度移动。顶部的项目将缓慢移动到内部放置,而底部的物品将快速移动到位。苹果的默认动画总是从