У меня есть много точек (40-100), которые я использую, чтобы построить многоугольник для размещения в виде карты моего приложения.Однако при использовании этого количества точек наложения отказываются отображаться, нет ошибок или чего-либо еще.Если я вернусь к использованию меньшего количества точек (4-8), снова отобразятся оверлеи.В чем причина этого и как я могу обойти эту проблему?Заранее спасибо!
РЕДАКТИРОВАТЬ 1:
Вот весь соответствующий код из моей карты:
Заголовок:
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "PermitListViewController.h"
@interface ParkingMapViewController : UIViewController <MKMapViewDelegate> {
MKMapView *mapView;
permitTypes permitType;
}
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic) permitTypes permitType;
-(void)loadAnnotations; //helper function that loads all annotation data from plist
-(void)loadOverlays; //helper function that loads all overlay data from plist
-(void)showCurrentLocationButtonTapped:(id)sender;
@end
Реализация (удалена)некоторые функции, относящиеся к аннотациям и выноскам, поскольку они здесь не имеют отношения):
#import "ParkingMapViewController.h"
#import "MKMapView+ZoomLevel.h"
#import "ParkingAnnotation.h"
#import "ParkingAnnotationView.h"
#import "PermitDetailViewController.h"
#import "ParkingRegionOverlay.h"
#import "CoreDataSingleton.h"
//#define UCD_LATITUDE <some lat>
//#define UCD_LONGITUDE <some long>
@implementation ParkingMapViewController
@synthesize mapView;
@synthesize permitType;
#pragma mark Custom Methods
- (void)showCurrentLocationButtonTapped:(id)sender {
NSLog(@"Showing current location.");
if ([mapView showsUserLocation] == NO) {
[mapView setShowsUserLocation:YES];
}
[mapView setCenterCoordinate:mapView.centerCoordinate zoomLevel:13 animated:YES];
}
//...
#pragma mark Builtin Methods
/*
// The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
// Custom initialization
}
return self;
}
*/
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
[super viewDidLoad];
mapView.delegate = self;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:100
target:self action:@selector(showCurrentLocationButtonTapped:)];
[self loadOverlays];
[self loadAnnotations];
CLLocationCoordinate2D centerCoord = { UCD_LATITUDE, UCD_LONGITUDE };
[mapView setCenterCoordinate:centerCoord zoomLevel:13 animated:NO]; //from "MKMapView+ZoomLevel.h"
}
- (parkingAnnotationType)annotationTypeLookup:(permitTypes)pType
{
if (pType == permitTypeC) {
return annotationTypeC;
} else if (pType == permitTypeL) {
return annotationTypeL;
} else if (pType == permitTypeVisitor) {
return annotationTypeVisitor;
} else if (pType == permitTypeDisabled) {
return annotationTypeDisabled;
} else if (pType == permitTypeVendor) {
return annotationTypeVendor;
} else if (pType == permitTypeBikeCommuter) {
return annotationTypeBikeCommuter;
}
return annotationTypeNone;
}
//helper function that loads all annotation data from plist
- (void)loadAnnotations{
//retrieve path of plist file and populate relevant types with its information
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"PermitData" ofType:@"plist"];
NSDictionary *rootOfPermitDataPlistDict = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
if ([[self title] isEqualToString:@"All Permits"]) {
for (id key in rootOfPermitDataPlistDict) {
NSMutableDictionary *permitDict = [rootOfPermitDataPlistDict objectForKey:key];
//array containing annotation information: latitude, longitude, title, subtitle(see PermitData.plist)
NSArray *annotationsArray = [permitDict objectForKey:@"annotations"];
CLLocationCoordinate2D workingCoordinate;
//loop through annotations array, creating parking annotations filled with the information found in the plist
for(NSDictionary *annotationContainerDict in annotationsArray){
ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
workingCoordinate.latitude = [[annotationContainerDict objectForKey:@"latitude"] doubleValue];
workingCoordinate.longitude = [[annotationContainerDict objectForKey:@"longitude"] doubleValue];
[parkingAnnot setCoordinate:workingCoordinate];
[parkingAnnot setTitle:[annotationContainerDict objectForKey:@"title"]];
[parkingAnnot setSubtitle:[annotationContainerDict objectForKey:@"subtitle"]];
[parkingAnnot setAnnotationType:[self annotationTypeLookup:permitType]];
if (parkingAnnot.annotationType == permitTypeC) [parkingAnnot setAnnotationType:annotationTypeC];
else if (parkingAnnot.annotationType == permitTypeL) [parkingAnnot setAnnotationType:annotationTypeL];
else if (parkingAnnot.annotationType == permitTypeVisitor) [parkingAnnot setAnnotationType:annotationTypeVisitor];
else if (parkingAnnot.annotationType == permitTypeDisabled) [parkingAnnot setAnnotationType:annotationTypeDisabled];
else if (parkingAnnot.annotationType == permitTypeVendor) [parkingAnnot setAnnotationType:annotationTypeVendor];
else if (parkingAnnot.annotationType == permitTypeBikeCommuter) [parkingAnnot setAnnotationType:annotationTypeBikeCommuter];
[mapView addAnnotation:parkingAnnot];
[parkingAnnot release];
}//for
}//for
}//if
else {
NSDictionary *permitDict = [[NSDictionary alloc] initWithDictionary:[rootOfPermitDataPlistDict objectForKey:[self title]]];
//array containing annotation information: latitude, longitude, title, subtitle(see PermitData.plist)
NSArray *annotationsArray = [[NSArray alloc] initWithArray:[permitDict objectForKey:@"annotations"]];
[permitDict release];
[rootOfPermitDataPlistDict release];
CLLocationCoordinate2D workingCoordinate;
NSDictionary *annotationContainerDict = [[NSDictionary alloc] init];
//loop through annotations array, creating parking annotations filled with the information found in the plist
for(annotationContainerDict in annotationsArray){
ParkingAnnotation *parkingAnnot = [[ParkingAnnotation alloc] init];
workingCoordinate.latitude = [[annotationContainerDict objectForKey:@"latitude"] doubleValue];
workingCoordinate.longitude = [[annotationContainerDict objectForKey:@"longitude"] doubleValue];
[parkingAnnot setCoordinate:workingCoordinate];
[parkingAnnot setTitle:[annotationContainerDict objectForKey:@"title"]];
[parkingAnnot setSubtitle:[annotationContainerDict objectForKey:@"subtitle"]];
if (permitType == permitTypeC) [parkingAnnot setAnnotationType:annotationTypeC];
else if (permitType == permitTypeL) [parkingAnnot setAnnotationType:annotationTypeL];
else if (permitType == permitTypeVisitor) [parkingAnnot setAnnotationType:annotationTypeVisitor];
else if (permitType == permitTypeDisabled) [parkingAnnot setAnnotationType:annotationTypeDisabled];
else if (permitType == permitTypeVendor) [parkingAnnot setAnnotationType:annotationTypeVendor];
else if (permitType == permitTypeBikeCommuter) [parkingAnnot setAnnotationType:annotationTypeBikeCommuter];
[mapView addAnnotation:parkingAnnot];
[parkingAnnot release];
}//for
[annotationContainerDict release];
[annotationsArray release];
}//else
}//loadAnnotations
//helper function that loads all overlay data from Core Data and adds it to map view
-(void)loadOverlays{
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
CoreDataSingleton *coreDataSingleton = [CoreDataSingleton sharedManager];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"ParkingLot" inManagedObjectContext:[coreDataSingleton managedObjectContext]];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [[coreDataSingleton managedObjectContext] executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *info in fetchedObjects) {
NSArray *pointsArray = [NSArray arrayWithArray:[info valueForKey:@"coordPoints"]];
ParkingRegionOverlay *regionPolygon = [[ParkingRegionOverlay alloc] initWithPoints:pointsArray andTitle:[info valueForKey:@"lotId"]];
[mapView addOverlay:regionPolygon];
}
[fetchRequest release];
}//loadOverlays
//...
//customizes overlay view
- (MKOverlayView *)mapView:(MKMapView *)mapView
viewForOverlay:(id <MKOverlay>)overlay
{
if ([overlay isKindOfClass:[ParkingRegionOverlay class]])
{
//get the MKPolygon inside the ParkingRegionOverlay...
MKPolygon *proPolygon = ((ParkingRegionOverlay*)overlay).polygon;
MKPolygonView *aView = [[[MKPolygonView alloc]
initWithPolygon:proPolygon] autorelease];
aView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.7];
aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
aView.lineWidth = 3;
return aView;
}
return nil;
}
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
[super viewDidUnload];
//[mapView setShowsUserLocation:NO];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[mapView release];
[super dealloc];
}
@end
Это может быть проблема с памятью в функции loadOverlays ... однако весь вывод консоли такой же, как и должен быть, но с распечаткой большего количества координат, и приложение никогда не падает из-за слишком большого количества объектов или чего-то еще.Спасибо!