5

MKMapView説明するのが難しい非常に奇妙な問題を抱えていることがあります。MKOverlayオーバーレイのポイントをファイルに保存し、にオーバーレイをロードすることで、セッション間で保存されるがありますviewDidLoad。だからここに問題があります:

手順

  1. にを追加MKOverlayしますMKMapView
  2. マップにを追加した後の2回目または3回目の実行ではMKOverlay、マップ上のすべてのものが、追加したものと同じ色のオーバーレイでオーバーレイされます。ビューがロードされたときに表示されるマップのビューを除く、マップ上のすべて。

その他の奇妙なこと:

  1. mapView.showsUserLocationこの問題は、がtrueに設定されている場合にのみ発生します
  2. この問題はでのみ発生しiOS5ます。すべてが正常に動作しiOS6ます。
  3. 色付きのオーバーレイをズームアウトすると、マップの表示部分のサイズが変更され、ズームアウトした新しいレベルでマップが塗りつぶされます。

この男は同じ問題を抱えていますが、彼の解決策は私にはうまくいきませんでした。

MKPolylineとMKPolylineViewを使用したオーバーレイの問題

これが私のコードの一部です:

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

    MKPinAnnotationView *pinView = nil; //switch this to MKAnnotationView and use .image property if pins need to be images

     if(annotation == self.startingPin || annotation == self.endingPin){

        static NSString *defaultPinID = @"com.MagnusDevelopment.pin";

        pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];

        if (pinView == nil)pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:defaultPinID];

        pinView.canShowCallout = YES;
        pinView.animatesDrop = TRUE;

        if(annotation == self.startingPin){
        //starting pin
            pinView.pinColor = MKPinAnnotationColorGreen;
        }else{
        //ending pin
            pinView.pinColor = MKPinAnnotationColorRed;
        }

    }
    return pinView;
}

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay
{
    MKPolylineView *aView = [[MKPolylineView alloc] initWithPolyline:(MKPolyline *)overlay];
    aView.lineWidth = 7.0;
    aView.strokeColor = [[UIColor blueColor] colorWithAlphaComponent:0.6];
    return aView;
}

ビューが読み込まれるときに呼び出されるコード。ポリライン配列に追加される座標を、追加される直前にログに記録しました。すべてが正常でダンディです。

    NSInteger numberOfSteps = pointsArray.count;

    NSLog(@"number of steps: %i",numberOfSteps);

    CLLocationCoordinate2D coordinates[numberOfSteps];
    for (NSInteger index = 0; index < numberOfSteps; index++) {
        CLLocation *location = [pointsArray objectAtIndex:index];
        CLLocationCoordinate2D coordinate = location.coordinate;
        coordinates[index] = coordinate;
    }
    MKPolyline *polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfSteps];
    [self.mainMap addOverlay:polyLine];

これは、オーバーレイが表示され、ユーザーがマップの横にパンしたときに何が起こるかを示しています ここに画像の説明を入力してください 。問題が何であるかについてのアイデアはありますか?

4

2 に答える 2

1

dequeueReusableAnnotationViewWithIdentifierを使用していますが、dequeueReusableAnnotationViewWithIdentifierの結果がnilの場合にのみ、pinViewに注釈を割り当てています。

そのメソッドは既存のMKPinAnnotationViewインスタンスを返すことが多いため、代わりに次のようにする必要があります。

MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID];
if (pin == nil) {
    pin = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID];
} else {
    pin.annotation = annotation;
}
于 2013-03-01T05:47:03.403 に答える
0

これが問題である可能性があります。mapviewがユーザーの現在の場所のビューにアクセスしようとすると、カスタマイズされたビューが渡されます。

これを既存の実装に追加してみてください。

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

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

PS:これはオーバーレイビューの問題ではないかもしれません。

よろしくお願いします。

于 2013-03-06T06:55:55.480 に答える