Ey là, comme le dit le titre, j'ai du mal à ajouter un MKPolygon comme une superposition à un MKMapView. Voici le code correspondant:
ParkingMapViewContoller.hProblèmes Ajout de MKPolygon en superposition à un MKMapView
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface ParkingMapViewController : UIViewController <MKMapViewDelegate> {
MKMapView *mapView;
}
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
-(void)loadAnnotations;
-(void)showCurrentLocationButtonTapped:(id)sender;
@end
ParkingMapViewController.m
//...
#import "ParkingRegionOverlay.h"
//...
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",self.title);
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:100 target:self action:@selector(showCurrentLocationButtonTapped:)];
/*MKMapPoint points[3] = {{38.53607,-121.765793}, {38.537606,-121.768379}, {38.53487,-121.770578}};
MKPolygon *polygon = [MKPolygon polygonWithPoints:points count:3];*/
ParkingRegionOverlay *polygon = [[ParkingRegionOverlay alloc] initialize];
[mapView addOverlay:polygon];
[self loadAnnotations];
CLLocationCoordinate2D centerCoord = { UCD_LATITUDE, UCD_LONGITUDE };
[mapView setCenterCoordinate:centerCoord zoomLevel:13 animated:NO]; //from "MKMapView+ZoomLevel.h"
}
//...
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
NSLog(@"in viewForOverlay!");
if ([overlay isKindOfClass:[MKPolygon class]])
{
MKPolygonView* aView = [[[MKPolygonView alloc] initWithPolygon:(MKPolygon*)overlay] autorelease];
aView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.7];
aView.lineWidth = 3;
return aView;
}
return nil;
}
//...
ParkingRegionOverlay.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface ParkingRegionOverlay : NSObject <MKOverlay> {
//CLLocationCoordinate2D origin;
MKPolygon *polygon;
//MKMapRect rect;
}
//@property (nonatomic) CLLocationCoordinate2D origin;
@property (nonatomic, retain) MKPolygon *polygon;
//@property (nonatomic) MKMapRect rect;
-(ParkingRegionOverlay*)initialize;
-(MKMapRect)boundingMapRect;
-(CLLocationCoordinate2D)coordinate;
@end
ParkingRegionOverlay.m
#import "ParkingRegionOverlay.h"
@implementation ParkingRegionOverlay
//@synthesize origin;
@synthesize polygon;
//@synthesize rect;
-(ParkingRegionOverlay*) initialize {
MKMapPoint points[3] = {{38.53607,-121.765793}, {38.537606,-121.768379}, {38.53487,-121.770578}};
polygon = [MKPolygon polygonWithPoints:points count:3];
polygon.title = @"Some Polygon";
return self;
}
- (MKMapRect)boundingMapRect{
MKMapRect bounds = MKMapRectMake(-121.770578,38.537606,-121.770578-(-121.765793),38.537606-38.53487);
return bounds;
}
- (CLLocationCoordinate2D)coordinate{
return CLLocationCoordinate2DMake((38.537606-38.53487)/2, (-121.770578-(-121.765793))/2);
}
@end
Vous voyez que je NSLog coincé dans la viewForOverlay: méthode? Eh bien, cela n'apparaît jamais dans la console, de sorte que cette fonction n'est jamais appelée. Une idée de ce qui ne va pas? Merci beaucoup!
J'ai oublié d'expliquer pourquoi viewDidOverlay n'a pas été appelée même si le délégué de la vue cartographique a été défini (ce qui doit être le cas) La méthode viewDidOverlay n'est appelée que lorsque le boundingMapRect de la superposition est visible dans la région actuelle. , il n'était pas considéré comme "visible" et viewDidOverlay ne recevait pas d'appel – Anna
Dang mec, tu connais vraiment ton truc Incroyable ... Merci mec! Je n'ai aucune idée de combien de temps j'ai essayé de faire marcher ça. Oh et pendant que je suis sur le sujet, comment pourrais-je faire pour faire sortir une légende de la superposition quand elle est tapée? Pas besoin d'une longue explication, mais si vous pouviez me diriger vers une méthode ou un document qui serait génial. Merci beaucoup! – Stunner
Malheureusement, une vue de superposition n'a pas de légende intégrée comme MKAnnotationView, donc plus de travail est nécessaire. Vous pouvez utiliser un UIGestureRecognizer pour détecter le toucher (voir [cette réponse] (http://stackoverflow.com/questions/4317810/how-to-capture-tap-gesture-on-mkmapview)). Utilisez un seul robinet, appuyez deux fois, appuyez longuement - tout ce qui fonctionne pour vous. Le double-tap serait en conflit avec le zoom si. Dans cette réponse, dans la méthode handleGesture, vous pouvez vérifier si le point de contact se trouve dans boundingMapRect de l'overlay en utilisant MKMapRectContainsPoint, puis afficher une vue en popup. – Anna