2

我正在将多个注释加载到我的地图视图中。加载地图时,这些注释显示为图钉。

通过使用下面的代码,我可以直接显示一个注释的标题,但对于剩余的注释,用户需要点击 pin 才能看到标题。

我想在加载 Mapview 时显示所有注释的标题而不触摸注释引脚

NSMutableArray * locations = [[NSMutableArray alloc] init];

_myAnn = [[MKPointAnnotation alloc] init];
_locationCoordinate.latitude = 27.175015;
_locationCoordinate.longitude = 78.042155;
_myAnn.coordinate = _locationCoordinate;
_myAnn.title = @"A";
[locations addObject:_myAnn];

_myAnn = [[MKPointAnnotation alloc] init];
_locationCoordinate.latitude = 28.171391;
_locationCoordinate.longitude = 79.037090;
_myAnn.coordinate = _locationCoordinate;
_myAnn.title = @"B";
[locations addObject:_myAnn];

_myAnn = [[MKPointAnnotation alloc] init];
_locationCoordinate.latitude = 29.169005;
_locationCoordinate.longitude = 80.043206;
_myAnn.coordinate = _locationCoordinate;
_myAnn.title = @"C ";
[locations addObject:_myAnn];

[self.map_View addAnnotations:locations];

  // i am using below method to display title for one annotation

      // [self.map_View selectAnnotation:_myAnn animated:YES];

     for (MKPointAnnotation *annotation in locations) {
  [self.map_View selectAnnotation:annotation animated:NO];
  }

MKCoordinateSpan span;
Span. latitudeDelta = 10;
Span. longitudeDelta = 10;

MKCoordinateRegion region;

region.span = span;
region.center = _locationCoordinate;

[self.map_View setRegion:region animated:YES];

提前致谢..

4

2 回答 2

1

更新这确实似乎是不可能的——至少对于地图视图注释 API 来说是不可能的。尽管存在 select 和 deselect 方法,并且 selected annotations 属性是一个数组,但似乎一次只能选择一个 annotation。

看起来您将需要按照此答案中的建议创建自定义注释视图-在 MKMapView 中显示多个注释标注

于 2014-06-17T02:25:36.553 回答
0

根据MKAnnotationView 类参考,注释标注气泡会在selected属性值更改时出现和消失。该文件指出开发人员“不应直接设置此属性的值”,但是您可以尝试:)

我要尝试的第一个是依赖该MKAnnotationView属性的最简单的hacky方式。在您的MKMapViewDelegate类中,定义以下方法:

- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view
{
    view.selected = YES;
}

但我想这可能效果不佳,因为在点击不同的注释时会出现视觉伪影。如果这是真的,那么实现您想要的唯一正确方法是创建MKAnnotationView始终显示标注气泡的子类,而不管selected属性的值如何。以下是有关如何创建自定义注释视图的一些教程:

更新

感谢@Paulw11 的回答,我忘了提到要使“hacky”方法起作用,您需要select为所有注释设置值。这可以通过 3 种方式完成:

  1. 根据@Paulw11 的回答(但这不适用于地图可见矩形之外的注释)
  2. 在'方法的实现中设置MKAnnotationView'属性(不确定这是否可行)selectedMKMapViewDelegatemapView:viewForAnnotation:
  3. 每次地图视图可见区域更改时,设置可见注释的MKAnnotationView'属性。selected

使用第三种方法,我需要实现MKMapViewDelegate'mapView:regionDidChangeAnimated:方法来处理地图视图可见区域的变化。由于在用户拖动或放大/缩小时经常调用此委托方法,因此推迟注释视图的实际更新直到地图视图的可见区域更改结束是有意义的;为此,我会使用 NSTimer。

// In an interface or interface extension for MKMapViewDelegate class (guess this
// is your view controller), declare NSTimer and a method which will be executed
// when a user stops dragging or zooming
@property (nonatomic, strong) NSTimer* mapViewRegionChangeTimer;
- (void)mapViewRegionChangeCompleted:(NSTimer*)timer;


// In your implementation of MKMapViewDelegate:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    if (self.mapViewRegionChangeTimer != nil) {
        [self.mapViewRegionChangeTimer invalidate];
    }
    self.mapViewRegionChangeTimer = 
        [NSTimer scheduledTimerWithTimeInterval:0.2
                                         target:self
                                       selector:@selector(mapViewRegionChangeCompleted:)
                                       userInfo:nil
                                        repeats:NO];
}

- (void)mapViewRegionChangeCompleted:(NSTimer*)timer
{
    [self.mapViewRegionChangeTimer invalidate];
    self.mapViewRegionChangeTimer = nil;

    NSSet* visibleAnnotations = [self.map_View annotationsInMapRect:self.map_View.visibleMapRect];
    for (id<MKAnnotation> annotation in visibleAnnotations) {
        [self.map_View selectAnnotation:annotation animated:NO];
    }
}
于 2014-06-17T02:31:58.833 回答