我是一位经验丰富的 iOS 开发人员,但这确实让我感到难过。我同时向 Apple 提交问题报告。
我正在向 MKMapKit 地图(Xcode 4.6)添加注释。每个注解都是一个 MyAnnotation 类;MyAnnotation 定义了一个属性 location_id,我用它来跟踪该注释。
问题很简单:我希望 location_id 为 -1 的 MyAnnotation 出现在其他所有内容的前面。
为此,我在我的 MKMapViewDelegate 中覆盖 mapView:didAddAnnotationViews:
-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
// Loop through any newly added views, arranging them (z-index)
for (MKAnnotationView* view in views) {
// Check the location ID
if([view.annotation isKindOfClass:[MyAnnotation class]] && [((MyAnnotation*)(view.annotation)).location_id intValue]==-1 ) {
// -1: Bring to front
[[view superview] bringSubviewToFront:view];
NSLog(@"to FRONT: %@",((MyAnnotation*)view.annotation).location_id);
} else {
// Something else: send to back
[[view superview] sendSubviewToBack:view];
NSLog(@"to BACK: %@",((MyAnnotation*)view.annotation).location_id);
}
}
}
这很好用。我有一个“添加”按钮,可以将注释添加到地图中心附近的随机位置。每次我按下“添加”按钮时,都会出现一个新注释;但没有任何东西可以隐藏 location_id 为 -1 的注释。
**直到**我滚动!
一旦我开始滚动,我的所有注释都会重新排列(z 顺序),并且我的仔细堆叠不再适用。
真正令人困惑的是,我之前已经完成了图标顺序堆叠,没有任何问题。我创建了一个全新的单视图应用程序来测试这个问题;将 MKAnnotationView 项目发送到后面或前面仅在您滚动之前有效。除了上面描述的代码之外,这个骨架应用程序中没有其他内容。我想知道最新的 MapKit 框架中是否存在某种错误。
最初的问题是在用户滚动时尝试添加新的注释(mapView:regionDidChangeAnimated:)。注释添加;mapView:didAddAnnotationViews: 代码触发;然后订单被框架中一只看不见的手打乱(大概是在卷轴完成时)。
如果您有兴趣,这是我的 viewForAnnotation:
-(MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
// Is this an A91Location?
if([annotation isKindOfClass:[MyAnnotation class]]){
MyAnnotation* ann=(MyAnnotation*)annotation;
NSLog(@"viewForAnnotation with A91Location ID %@",ann.location_id);
if([ann.location_id intValue]==-1){
// If the ID is -1, use a green pin
MKPinAnnotationView* green_pin=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
green_pin.pinColor=MKPinAnnotationColorGreen;
green_pin.enabled=NO;
return green_pin;
} else {
// Otherwise, use a default (red) pin
MKPinAnnotationView* red_pin=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
red_pin.enabled=NO;
return red_pin;
}
}
// Everything else
return nil;
}
我的班级:
@interface MyAnnotation : NSObject <MKAnnotation>
@property (strong, nonatomic, readonly) NSNumber* location_id;
@property (strong, nonatomic, readonly) NSString* name;
@property (strong, nonatomic, readonly) NSString* description;
@property (nonatomic) CLLocationCoordinate2D coordinate;
-(id) initWithID:(NSNumber*)location_id name: (NSString*) name description:(NSString*) description location:(CLLocationCoordinate2D) location;
// For MKAnnotation protocol... return name and description, respectively
-(NSString*)title;
-(NSString*)subtitle;
@end