Ey, como dice el título, me está resultando difícil agregar un MKPolygon como una superposición a un MKMapView. Aquí está el código correspondiente:
ParkingMapViewContoller.hProblemas Agregar MKPolygon como una superposición a 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
Ves que NSLog me quedé en el viewForOverlay: método? Bueno, eso nunca aparece en la consola, por lo que nunca se llama a la función. ¿Alguna idea de lo que está mal? ¡Muchas gracias!
Olvidé explicar por qué viewDidOverlay no se ha llamado aunque se haya establecido el delegado de vista de mapa (que debe serlo independientemente). El método viewDidOverlay solo se invoca cuando el boundingMapRect de la superposición esté visible en la región actual. , no se consideró "visible" y viewDidOverlay no se llamaba. – Anna
Dang man, realmente sabes tus cosas. Increíble ... ¡Gracias, hombre! no tengo idea de cuánto tiempo he estado tratando de hacer que eso funcione. Ah, y mientras estoy en el tema, ¿cómo voy a hacer una llamada emergente de la superposición cuando se toca? No hace falta una explicación larga, pero si pudieras indicarme un método o un documento, sería genial. ¡Muchas gracias! – Stunner
Lamentablemente, una vista de superposición no tiene un rótulo incorporado como MKAnnotationView, por lo que se necesita más trabajo. Puede usar un UIGestureRecognizer para detectar el toque (consulte [esta respuesta] (http://stackoverflow.com/questions/4317810/how-to-capture-tap-gesture-on-mkmapview)). Use un solo toque, doble toque, mantenga presionada, lo que sea que funcione para usted. Sin embargo, el doble toque entrará en conflicto con el zoom. En esa respuesta, en el método handleGesture, puede verificar si el punto de contacto está en el boundingMapRect de la superposición usando MKMapRectContainsPoint y luego abrir una vista emergente. – Anna