Iphone MapView-一次显示一个注释
我目前正在通过一个循环向我的地图添加注释。。。但是注释只以组的形式出现在我的地图上。此外,在加载时,地图上实际上只显示大约4个注释。。。但当我稍微移动地图时,所有应该在那里的注释突然出现 如何将所有注释加载到正确的位置,一次加载一个 提前谢谢 下面是我用来添加注释的代码:Iphone MapView-一次显示一个注释,iphone,annotations,android-mapview,Iphone,Annotations,Android Mapview,我目前正在通过一个循环向我的地图添加注释。。。但是注释只以组的形式出现在我的地图上。此外,在加载时,地图上实际上只显示大约4个注释。。。但当我稍微移动地图时,所有应该在那里的注释突然出现 如何将所有注释加载到正确的位置,一次加载一个 提前谢谢 下面是我用来添加注释的代码: NSString *incident; for (incident in weekFeed) { NSString *finalCoordinates = [[NSSt
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];
}
关于第二个问题,在移动地图之前,项目不会始终显示。我看不到您的代码中有任何明显的错误,但以下是我将采取的一些措施来隔离问题: