Mus*_*afa 6 mkmapview mkannotation mkannotationview ios
我们如何确保将注释视图放置在地图上的指定顺序/位置?
我有一个案例,一个地址可以有多个注释(在彼此之上).例如,Pin编号1,2,3和4放置在相同的地理位置.当地图加载时,我希望Pin#1位于顶部,但是无法确保Pin#1始终可见(在顶部).
环顾四周,我找到了以下解决方案,但这些都没有对我有用.
1).按照您希望的顺序将注释添加到地图.
根据我的经验,它不起作用!根据我的经验,使用addAnnotations:或逐个添加注释一起添加注释会产生相同的结果.注释视图的顺序仍然是随机的.
[self.mapView addAnnotations:allAnnotations];
Run Code Online (Sandbox Code Playgroud)
生成相同的结果:
for (MyCustomAnnotation *annotation in allAnnotations) {
[self.mapView addAnnotation:annotation];
}
Run Code Online (Sandbox Code Playgroud)
2).使用bringSubviewToFront或sendSubviewToBack指定所有注释的顺序.
根据我的经验,它不起作用!例如,以下代码不会生成所需的结果:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
// .tag associated with each view specifies the order/hierarchy of annotation views
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:YES];
NSArray *orderedAnnotationViews = [views sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
for (MKAnnotationView *annotationView in orderedAnnotationViews) {
[mapView sendSubviewToBack:annotationView];
}
}
Run Code Online (Sandbox Code Playgroud)
3).使用annotationView.layer.zPosition指定所有注释的确切顺序.
考虑4个引脚重叠的情况,例如引脚1,2,3和4.这种方法的问题是,点击特定的注释引脚或以编程方式选择它不会将它带到前面.的zPosition是绝对的.您可以在每次选择引脚时更改它,但这并不理想.
zPosition属性指定图层位置的z轴分量.zPosition旨在用于设置图层相对于其兄弟图层的视觉位置.它不应该用于指定图层兄弟的顺序,而是重新排序子图层数组中的图层.
思考?
我最终与zPosition:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"tag" ascending:NO];
NSArray *sortedViews = [views sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
// Set zPosition
for (MKAnnotationView *annotationView in sortedViews) {
annotationView.layer.zPosition = ++_zPositionForAnnotationViews;
}
// Do whatever
// . . .
}
- (void)mapView:(MKMapView *)aMapView didSelectAnnotationView:(MKAnnotationView *)view {
NSLog(@"The annotation tapped is: %@", view.annotation.title);
// Ignore tap on user location
if ([view.annotation isKindOfClass:[MKUserLocation class]]) {
return;
}
// Update zPosition (to bring it to front)
view.layer.zPosition = ++_zPositionForAnnotationViews;
// Do whatever
// . . .
}
Run Code Online (Sandbox Code Playgroud)
哪里_zPositionForAnnotationViews是类变量。
| 归档时间: |
|
| 查看次数: |
1975 次 |
| 最近记录: |