首先,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];
中,称为递归。
答案 0 :(得分:2)
而不是使用上面的代码,你可以尝试这些代码。这对我有用......
在NSObject下创建新类,并命名为MapClass 在mapclass.h中
#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是MKmapview的变量,在.h文件中声明。
答案 1 :(得分:2)
首先,您不应该自己调用didAddAnnotationViews
委托方法。地图视图本身会在实际显示您添加到地图中的注释后调用它(使用addAnnotation
或addAnnotations
)。
其次,在该方法中这一行:
[mapView addAnnotations:views];
至少有两个原因是错误的:
views
参数是NSArray
MKAnnotationViews
(不是 id<MKAnnotation>
个对象的addAnnotations
。 NSArray
方法需要id<MKAnnotation>
个addAnnotations
个对象。didAddAnnotationViews
委托方法中调用mapView.annotations
可能不是一个好主意(可能导致委托方法被递归调用,导致堆栈溢出)最后,如果你想缩放地图以便它显示所有注释,那么已经有许多答案可能的解决方案(例如搜索“mkmapview注释区域适合缩放”或类似的东西)。以下是您可以尝试的一些答案:
基本上,循环遍历MKCoordinateRegion
数组以查找最小和最大纬度/经度值。然后从中创建setRegion
(中心是中点,delta是差异)。然后拨打{{1}}。