gpt4 book ai didi

ios - 处理重叠的 MKAnnotationView(s)

转载 作者:可可西里 更新时间:2023-11-01 03:55:53 25 4
gpt4 key购买 nike

我们如何确保注释 View 在 map 上按指定的顺序/位置放置?

我有一个情况,一个地址可以有多个注释(在彼此之上)。例如,Pin 编号 1、2、3 和 4 位于同一地理位置。加载 map 时,我希望 Pin # 1 位于顶部,但无法确保 Pin # 1 始终可见(在顶部)。

环顾四周,我找到了以下解决方案,但没有一个对我有用。

1).按照您想要的顺序将注释添加到 map 。

根据我的经验,这是行不通的!根据我的经验,使用 addAnnotations: 将注释添加在一起或将它们一个接一个地添加会产生相同的结果。注释 View 的顺序仍然是随机的。

[self.mapView addAnnotations:allAnnotations];

生成与以下相同的结果:

for (MyCustomAnnotation *annotation in allAnnotations) {
[self.mapView addAnnotation:annotation];
}

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];
}
}

3).使用 annotationView.layer.zPosition 指定所有注释的确切顺序。

考虑 4 个引脚重叠的场景,例如Pin 1、2、3 和 4。此方法的问题在于,点击特定注释 pin 或以编程方式选择它不会将其置于最前面。 zPosition 是绝对的。您可以在每次选择图钉时更改它,但这并不理想。

The zPosition property specifies the z-axis component of the layer's position. The zPosition is intended to be used to set the visual position of the layer relative to its sibling layers. It should not be used to specify the order of layer siblings, instead reorder the layer in the sublayer array.

想法?

最佳答案

我最终使用了 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
// . . .
}

其中 _zPositionForAnnotationViews 是类变量。

关于ios - 处理重叠的 MKAnnotationView(s),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com