iOS在mapkit中引脚颜色问题
我想要两种颜色的注释。 为此,我使用了以下代码,
- (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation { static NSString *identifier = @"MyLocation"; if ([annotation isKindOfClass:[PlaceMark class]]) { MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; annotationView.enabled = YES; annotationView.canShowCallout = YES; @try { if (annotationView == nil) { annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier]; } else { annotationView.annotation = annotation; if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"]) { annotationView.pinColor = MKPinAnnotationColorRed; } else { annotationView.pinColor = MKPinAnnotationColorGreen; } } } @catch (NSException *exception) { NSLog(@"nsCenterOrOffice exception = %@",exception); } return annotationView; } return nil; }
但是我仍然无法为所需的注释设置所需的颜色。 有时特定的注释针颜色是红色的,有时是绿色的。 我不明白为什么会发生这种情况。 有谁能够帮助我 ? 谢谢…
我重写我的代码..这是我更新的代码
MapAnnotation.h
#import <MapKit/MapKit.h> #import <Foundation/Foundation.h> @interface MapAnnotation : MKPointAnnotation { NSString *title; NSString *subtitle; int dealLnk; float latitude; float longitude; CLLocationCoordinate2D coordinate; } @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle; @property (nonatomic, assign) int dealLnk; @property (nonatomic, assign) float latitude; @property (nonatomic, assign) float longitude; @property (nonatomic, readonly) CLLocationCoordinate2D coordinate; - (id)initWithTitle:(NSString *)ttl subTitle:(NSString *)subttl dealLink:(int)dealLnk latitude:(float)latitude longitude:(float)longitude andCoordinate:(CLLocationCoordinate2D)c2d; @end
MapAnnotation.m
#import "MapAnnotation.h" @implementation MapAnnotation @synthesize title,subtitle,dealLnk,coordinate,latitude,longitude; - (id)initWithTitle:(NSString *)ttl subTitle:(NSString *)subttl dealLink:(int)z latitude:(float)latitude1 longitude:(float)longitude1 andCoordinate:(CLLocationCoordinate2D)c2d { title = ttl; subtitle = subttl; dealLnk =z; coordinate = c2d; longitude = longitude1; latitude = latitude1; return self; } @end
这是我的实现文件
-(void)startAddingAnnotation { @try { CLLocationCoordinate2D annotationCoord; z=0; for (int i=0; i < [nslatitude count] ; i++,z++) { MapAnnotation *dealAnnotation = [[MapAnnotation alloc] init]; dealAnnotation.dealLnk = z; annotationCoord.latitude = (CGFloat) [[nslatitude objectAtIndex:i] floatValue]; annotationCoord.longitude = (CGFloat)[[nslongitude objectAtIndex:i] floatValue]; dealAnnotation.coordinate = annotationCoord; dealAnnotation.title = [nsCenterName objectAtIndex:i]; dealAnnotation.subtitle = [nsCenterAddress objectAtIndex:i]; NSLog(@"latitude = %f",dealAnnotation.latitude); NSLog(@"longitude = %f",dealAnnotation.longitude); NSLog(@"dealAnnotation.dealLnk = %d",dealAnnotation.dealLnk); NSLog(@"dz = %d",z); [mapView addAnnotation:dealAnnotation]; } } @catch (NSException *exception) { NSLog(@"Exception = %@",exception); } cord.longitude = -112.05186; cord.latitude = 33.46577; MKCoordinateRegion region; region.center = cord; MKCoordinateSpan span = {.latitudeDelta = 1.0, .longitudeDelta = 1.0}; region.span = span; [mapView setRegion:region]; } #pragma mark - MapView_Delegate - (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation { MapAnnotation *annotation1 = (MapAnnotation *)annotation; z = annotation1.dealLnk; NSLog(@"annotation1.longitude = %f",annotation1.latitude); NSLog(@"annotation1.longitude = %f",annotation1.longitude); if(z<[nslatitude count]) { MKAnnotationView *pinView = nil; static NSString *defaultPinID = @"pin1"; pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; if ( pinView == nil ) pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation1 reuseIdentifier:defaultPinID]; pinView.canShowCallout = YES; @try { if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"]) { pinView.image = [UIImage imageNamed:@"flag1.png"]; } else { pinView.image = [UIImage imageNamed:@"flag2.png"]; } pinView.annotation = annotation1; pinView.tag = [[nsCenterName objectAtIndex:z] intValue]; } @catch (NSException *exception) { NSLog(@"nsCenterOrOffice exception = %@",exception); } UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; [rightButton setTitle:annotation.title forState:UIControlStateNormal]; [pinView setRightCalloutAccessoryView:rightButton]; return pinView; } else { return nil; } }
现在的问题是,所有的注释都指向不同的位置。 我不明白为什么会发生这种情况? 我的代码中是否有任何错误?
确定引脚颜色的条件是基于此委托方法之外的数据,并且不能保证与为特定注释调用此委托方法时同步。
在这个条件下:
if([[nsCenterOrOffice objectAtIndex:z] isEqualToString:@"C"])
z
variables显然是在这个委托方法之外声明和设置的一个实例variables(可能正好在添加注释之前)。
同样, 不能保证 viewForAnnotation
委托方法将在添加注释之后被立即调用。 也不保证委托方法每次只能被调用一次。 所以有可能的是, z
值并不对应于委托方法被调用的当前 annotation
。
在调用addAnnotation
之后调用delegate方法是非常有可能的,它将以不同于添加注释的顺序被调用,并且对于每个注释将被调用多次(例如,如果用户平移或放大地图和注释回来查看)。
要解决此问题,请将“is center or office”属性添加到Placemark
类本身,并在创build注释时以及调用addAnnotation
之前设置该属性。 然后,在viewForAnnotation
方法中,可以将annotation
参数viewForAnnotation
为地Placemark
并访问属性以实现条件。 例如:
//where you create and add the annotation: Placemark *pm = [[Placemark alloc... pm.coordinate = ... pm.title = ... pm.centerOrOffice = [nsCenterOrOffice objectAtIndex:z]; [mapView addAnnotation:pm]; //in viewForAnnotation: Placemark *myPlacemark = (Placemark *)annotation; if ([myPlacemark.centerOrOffice isEqualToString:@"C"]) ...
一个单独的,不相关的问题是注解视图创build逻辑不太正确。
代码调用initWithAnnotation
两次,实际上第二个initWithAnnotation
永远不会被调用,因为第一次调用总是成功的。
你可能想要的是首先调用dequeueReusableAnnotationViewWithIdentifier:
然后,如果返回nil
,则调用initWithAnnotation
。
在viewForAnnotation
重构代码时,一定要将设置pinColor
的代码放在注释视图的dequeue / init 之外 (例如在return annotationView;
之前),以正确处理重用视图。
您的viewForAnnotation
依赖于一些外部variables, nsCenterOrOffice
和z
。 直到您向我们展示如何设置这些variables,我们当然无法帮到您。
无论如何,这不是一个谨慎的做法。 你的viewForAnnotation
一般应该只依赖annotation
属性,而不是外部variables。