MKMapview を持つアプリを構築しています。私のコードが入っているビューは、MKMapView を拡張します。
データを取得した後、KMLParser を作成し、KML ファイルを解析させましたが、問題なく動作しているようです。ここのリンゴ開発者ドキュメントの例を介して、KMLParser のコードを取得しましたhttp://developer.apple.com/library/ios/#samplecode/KMLViewer/Introduction/Intro.html
私が言ったように、コードは機能しているようです。一部の KML ファイルは、マップにマーカーをロードするだけで、問題なく動作します。レンダリングされていないように見えるポリゴン オーバーレイを描画する必要があるのは、KML ファイルです。一番下の MKMapViewDelegate コードが必要なことをしていないのではないかと思っています。そこにブレークポイントを配置しましたが、ヒットすることはないようです。
これが私のビュー .h と .m の外観です。
.h
#import <MapKit/MapKit.h>
#import "MainDM.h"
#import "BBView.h"
#import "MapPM.h"
#import "KMLParser.h"
@class MapPM;
@class MainDM;
@interface MapView : MKMapView <BBView, MKMapViewDelegate>
{
NSArray *overlays;
KMLParser *parser;
}
@property(nonatomic,strong)MainDM* dm;
@property(nonatomic,strong)MapPM* pm;
-(void)update:(DataObject*)data;
-(id)initWithModel:(MainDM*)dm:(CGRect)frame;
@end
.m
#import "MapView.h"
@implementation MapView
-(id)initWithModel:(MainDM*)dm:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
_dm = dm;
[_dm register:self];
_pm = [[MapPM alloc] initWithModel:_dm];
CLLocationCoordinate2D coord = {.latitude = 32.61724, .longitude = -106.74128};
MKCoordinateSpan span = {.latitudeDelta = 1, .longitudeDelta = 1};
MKCoordinateRegion region = {coord, span};
[self setRegion:region];
}
return self;
}
-(void)update:(DataObject*)data
{
if([[data getType] isEqualToString:@"CURRENT_KML_CHANGE"])
{
KmlVO *d = (KmlVO*)[data getData];
parser = [_pm showMKL:d];
// Add all of the MKOverlay objects parsed from the KML file to the map.
NSArray *o = [parser overlays];
[self addOverlays:o];
// Add all of the MKAnnotation objects parsed from the KML file to the map.
NSArray *annotations = [parser points];
[self addAnnotations:annotations];
// Walk the list of overlays and annotations and create a MKMapRect that
// bounds all of them and store it into flyTo.
MKMapRect flyTo = MKMapRectNull;
for (id <MKOverlay> overlay in o)
{
if (MKMapRectIsNull(flyTo))
{
flyTo = [overlay boundingMapRect];
}
else
{
flyTo = MKMapRectUnion(flyTo, [overlay boundingMapRect]);
}
}
for (id <MKAnnotation> annotation in annotations)
{
MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
if (MKMapRectIsNull(flyTo))
{
flyTo = pointRect;
}
else
{
flyTo = MKMapRectUnion(flyTo, pointRect);
}
}
// Position the map so that all overlays and annotations are visible on screen.
//self.visibleMapRect = flyTo;
}
}
#pragma mark MKMapViewDelegate
- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
return [parser viewForOverlay:overlay];
}
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
return [parser viewForAnnotation:annotation];
}
@end