1

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
4

1 に答える 1

0

ビューにデリゲートであることを伝えていないことがわかったため、ポリゴンレイヤーを描画する下部のコードが実行されていませんでした。

initWithModel 関数に以下を追加するだけです

self.delegate = self;
于 2013-02-24T13:20:33.420 に答える