1

首先,MKMapView 中只有用户位置。经过一些操作后,我调用方法: [self mapView:self.mapView didAddAnnotationViews:self.pointersArray]; 我的didAddAnnotationViews方法:

-(void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views
{
    if (views.count == 1) {
        MKAnnotationView *annotationView = [views objectAtIndex:0];
        id<MKAnnotation>mp = [annotationView annotation];
        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 500, 500);
        [mapView setRegion:region animated:YES]; 
    }
    else {
        [mapView addAnnotations:views];
    } 
}

在不使用缩放之前,应用程序不会崩溃。但是当缩放使用超过 10 次(大约)时,我会在这个[mapView addAnnotations:views];或有时在return UIApplicationMain(argc, argv, nil, NSStringFromClass([BIDAppDelegate class]));. 错误 - EXC_BAD_ACCESS。有我的问题吗?

编辑

更改为[self.mapView setRegion:region animated:YES];但现在我在主线程中有错误MKNormalizedPointForLayer EXC_BAD_ACCESS。通常缩放工作正常,应用程序在使用缩放 7 次或更多次后崩溃。我的按钮操作:

- (void)showKantorsOnMap {
    if (self.kantorsData.count != self.pointersArray.count) {
        NSLog(@"need to wait more");
    }
    NSMutableArray *toRemove = [[NSMutableArray alloc] init];
    for (id annotation in self.mapView.annotations)
    if (annotation != self.mapView.userLocation)
        [toRemove addObject:annotation];
    [self.mapView removeAnnotations:toRemove];
    [self.mapView addAnnotations:self.pointersArray];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.mapView.userLocation.coordinate,6500, 6500);
    [self.mapView setRegion:region animated:YES]; 
}

解决方案 问题出在称为递归的didAddAnnotationViews方法中。[mapView addAnnotations:views];

4

2 回答 2

2

而不是使用上面的代码,你可以尝试这些代码..这对我有用......

在 NSObject 下创建新类并在 mapclass.h 中命名为 MapClass

 #import <UIKit/UIKit.h>
 #import <MapKit/MapKit.h>

@interface MapClass : NSObject <MKAnnotation>{
CLLocationCoordinate2D coordinate;
NSString *title;
NSString *subtitle;
}
@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle; 
@end

在 MapClass.m 文件中

#import "MapClass.h"

@implementation MapClass
@synthesize coordinate,title,subtitle;
@end

将其插入 .h 文件

#import <MapKit/MapKit.h>
@interface MapViewController : UIViewController

{

MKMapView *mapview;

}

@property (nonatomic, retain) IBOutlet MKMapView *mapview;
@end

将其插入 .m 文件

[mapview setMapType:MKMapTypeStandard];
    [mapview setZoomEnabled:YES];
    [mapview setScrollEnabled:YES];

    MKCoordinateRegion region = { {0.0, 0.0 }, {0.0, 0.0 } };
    region.center.latitude = xxx;//your longitude
    region.center.longitude = xxx;//your latitude
    region.span.longitudeDelta = 0.01f;
    region.span.latitudeDelta = 0.01f;
    [mapview setRegion:region animated:YES];

    MapClass *ann = [[MapClass alloc] init];
    ann.title = @"Title";
    ann.subtitle = @"Subtitle.";
    ann.coordinate = region.center;
    [mapview addAnnotation:ann];

//mapview 是 .h 文件中声明的 MKmapview 的变量。

于 2012-07-09T10:41:15.473 回答
2

首先,您不应该didAddAnnotationViews自己调用委托方法。地图视图本身将在实际显示您添加到地图的注释后调用它(使用addAnnotationaddAnnotations)。

其次,在该方法中,这一行:

[mapView addAnnotations:views];

至少有两个原因是错误的:

  • views参数是一个NSArray不是对象)MKAnnotationViews。该方法需要一个对象。 id<MKAnnotation>addAnnotationsNSArrayid<MKAnnotation>
  • addAnnotations在委托方法内调用didAddAnnotationViews可能不是一个好主意(可能会导致委托方法被递归调用导致堆栈溢出)

最后,如果您想缩放地图以显示所有注释,已经有许多可能的解决方案的答案(例如,搜索“mkmapview annotations region fit zoom”或类似的东西)。以下是您可以尝试的一些答案:

基本上,循环遍历mapView.annotations数组以找到最小和最大纬度/经度值。然后从中创建一个MKCoordinateRegion(中心是中点,增量是差异)。然后调用setRegion

于 2012-07-09T14:20:03.620 回答