1

ビューにアクセスするたびに、mapViewをデフォルトの場所に設定しています。ビューにアクセスすると正しい場所に表示される場合もありますが、ビューにアクセスすると、アフリカ南部の海の上のmapViewのデフォルトの場所に表示される場合もあります。ビューにアクセスしたときに、適切な場所にあることを確認するにはどうすればよいですか。

これが私のコードです:

-(void)viewDidLoad {

    [super viewDidLoad];

    self.mapView.delegate = self;

    MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
    region.center.latitude = 45.442424;
    region.center.longitude = -122.78;
    region.span.latitudeDelta =  0.60;
    region.span.longitudeDelta =  0.60;
    [mapView setRegion:region animated:YES];
}

これは、注釈をロードするものです。

-(void)initXML {

    NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];
    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
    xpathParser = [[TFHpple alloc] initWithHTMLData:data];
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];
    if (elements.count >= 1) {

        TFHppleElement *element = [elements objectAtIndex:0];
        TFHppleElement *child = [element.children objectAtIndex:0];
        NSString *idValue = [child content];

        NSString *idwithxml = [idValue stringByAppendingFormat:@".xml"];
        NSString *url = @"http://www.wccca.com/PITS/xml/fire_data_";
        NSString *finalurl = [url stringByAppendingString:idwithxml];

        xmlParser = [[XMLParser alloc] loadXMLByURL:finalurl];

        if (xmlParser.calls.count == 0) {

            [self noCallsMessage];
        }
        else {

            [self wcccaAnn];

            NSArray *callsArray = [xmlParser calls];

            for (JointCAD *call in callsArray) {
                NSString *callnumber = [call.callnumber stringByAppendingFormat:@". "];
                NSString *callandnumber = [callnumber stringByAppendingString:call.currentCallType];
                Annotation *ann = [[Annotation alloc] init];
                ann.title = callandnumber;
                ann.subtitle = [call location];
                ann.coordinate = CLLocationCoordinate2DMake([call.latitude doubleValue], [call.longitude doubleValue]);
                [mapView addAnnotation:ann]; }
            }
        }
    }

MKAnnotationView:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {

    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    MKPinAnnotationView *MyPin=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"current"];
    MyPin.pinColor = MKPinAnnotationColorRed;

    MyPin.draggable = NO;
    MyPin.highlighted = YES;
    MyPin.animatesDrop= YES;
    MyPin.canShowCallout = YES;

    return MyPin;
}
4

3 に答える 3

1

私は同じ問題を抱えていましたが、次の解決策(コードに適用されます)がうまくいきました:

-(void)viewDidLoad {

    [super viewDidLoad];

    self.mapView.delegate = self;

    double delayInSeconds = 0.5;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
        region.center.latitude = 45.442424;
        region.center.longitude = -122.78;
        region.span.latitudeDelta =  0.60;
        region.span.longitudeDelta =  0.60;
        [mapView setRegion:region animated:YES];
    });
}

基本的には、領域を設定するコードをブロックにラップし、そのブロックを の後に呼び出しますdelayInSeconds。シミュレーターで十分な 0.5 の遅延が見つかりましたが、最も遅いデバイスでテストする必要があります。

ブロックを使用したくない場合は、領域設定コードを別のメソッドでラップして、 のようなものを呼び出すこともできます[self performSelector:@selector(nameOfMethod) withObject:nil afterDelay:0.5f];

マップの読み込みが開始され、設定された地域にすばやくアニメーション化されます。このアニメーションが気に入らない場合は、animatedパラメータをに設定してくださいNO

于 2013-02-23T19:33:00.467 に答える
0

メイン キューとは異なるキューでマップを更新しています。幸運なことに、アプリケーションがあちこちでクラッシュしていません。ビュー操作をメイン スレッドに移動し、同じ問題が引き続き発生するかどうかを確認します。

編集:そのスパンを取得するために本当にキューを使用する必要がある場合は、ビューでこれを行うだけです:

dispatch_async(dispatch_get_main_queue(), ^{
    [mapView setRegion:region animated:YES]; 
});
于 2012-10-11T21:15:43.477 に答える
0

上記のコードには、マップにマップの場所を設定するポイントが 1 つしかありません ( setRegion)。マップが別の場所に設定されている場合、提供したコードにはありません。

于 2012-10-11T23:16:30.570 に答える