2

MKMapView でいくつかの基本的な描画機能をテストしていますが、奇妙なことが起こっています。以下のドロップボックスリンクを参照できます。これは、シミュレーターではなく、実際のデバイスで実行およびテストされています。

MKPolyLines の一部は接続されているためギザギザになっており、一部は接続されていないことに気付くでしょう。これの原因は何ですか?これは修正できますか? アンチエイリアスを設定するオプションはありませんでした。一番右のポリゴンが一番よく見えると思います。しかし、一般的に、一部の線は他の線よりも滑らかに見えます。

このスクリーンショットが表示されないもう 1 つのことは、ビューをタップして新しいオーバーレイを追加するたびに、マップ上のすべてのオーバーレイが、再描画されているか、再描画の速度が十分でないかのように「点滅」することです。これの原因は何だろうと思っていたのですが、おそらく私が知らないことで、これが起こらないようにするために何か他のことをしなければなりません.

デリゲートについても質問です。マップ上に 100 の異なるオーバーレイがあるとしたら? どのような種類の描画を実行するかを伝えるために、デリゲートのそれぞれについてチェックを行うことになっていますか? 私の場合は 3 つのケースしかありませんが、ここで設定したものを使用すると、このメソッドが非常に大きくなる可能性があると想像できます。これは余談ですが、ここに挿入すると思いました。

https://www.dropbox.com/s/dbordqnml33urmu/Screenshot%202013.03.28%2011.26.36.png

関連するコードは次のとおりです。

-(void)addCoordinateToList:(UITapGestureRecognizer*)recognizer{
    CGPoint tappedPoint = [recognizer locationInView:map];
    CLLocationCoordinate2D coord = [map convertPoint:tappedPoint toCoordinateFromView:map];
    NSLog(@"Coordinate Info: Lat %f, Lon %f", coord.latitude, coord.longitude);

    CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
    //Extension NSValue new for iOS6
    //[path addObject:[NSValue valueWithMKCoordinate:coord]];
    [path addObject:newLocation];

    [self drawPolygon];

    clearPolygonFromMap.enabled = YES;
    clearPolygonFromMap.alpha = 1.0;

    //add annotations
    [self setPolygonAnnotationWithCoordinate:coord andWithTitle:@"default title"];

}

// ポリラインを描画します。ポリゴンを設定しますが、シェイプの描画が完了するまでオーバーレイとして追加しないでください。ここには関係のないボタンの状態がたくさんあるため、このコードは含まれていません。

-(void)drawPolygon{

NSInteger numberOfCoordinates = path.count;
if(coords != NULL)
    free(coords);
coords = malloc(sizeof(CLLocationCoordinate2D) * numberOfCoordinates);

CLLocationCoordinate2D coordinates[numberOfCoordinates];
for(int pathIndex = 0; pathIndex < numberOfCoordinates; pathIndex++){
    CLLocation *location = [path objectAtIndex:pathIndex];
    coords[pathIndex] = location.coordinate;

    coordinates[pathIndex] = coords[pathIndex];
}

  polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
  polygon = [MKPolygon polygonWithCoordinates:coords count:path.count];
  [map addOverlay:polyLine];
}

// 円のオーバーレイを設定します

-(void)setPolygonAnnotationWithCoordinate:(CLLocationCoordinate2D)coord andWithTitle:(NSString *)polygonDescription{

    circle = [MKCircle circleWithCenterCoordinate:coord radius:15];
    circle.title = polygonDescription;
    [map addOverlay:circle];
    //[map addAnnotation:circle];
}

//MapView オーバーレイ デリゲート メソッド。オーバーレイをチェックするより良い方法はありますか? オーバーレイが 100 個あるとしたら

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{

    if(overlay == circle){
        pointCircleView = [[MKCircleView alloc]initWithOverlay:overlay];
        pointCircleView.strokeColor = [UIColor greenColor];
        pointCircleView.fillColor = [UIColor redColor];
        //circleView.alpha = 0.5;
        pointCircleView.lineWidth = 4.0;
        return pointCircleView;
    }
    else if(overlay == polyLine){
        borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
        borderView.strokeColor = [UIColor blackColor];
        borderView.lineWidth = 1.0;
        return borderView;
    }
    else if(overlay == polygon){
        polygonView = [[MKPolygonView alloc] initWithPolygon:polygon];
        polygonView.strokeColor = [UIColor blackColor];
        polygonView.lineWidth = 1.0;
        polygonView.fillColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.0 alpha:0.4];
        return polygonView;
    }

}
4

1 に答える 1

2

点滅については、この投稿を参照してください。オーバーレイ システムのバグである可能性があります。

ギザギザの線は、スクリーンショットではアンチエイリアス処理されているように見えますが、拡大されている可能性があります。実験の結果、オーバーレイは個別のズーム レベル用に個別のビットマップにレンダリングされ、現在のズーム レベルに合わせて拡大または縮小されたマップ ビュー上にレンダリングされると思います。したがって、そのレベルではオーバーレイが少し粗く見えるかもしれませんが、拡大または縮小すると少し改善されます。

デリゲートに関しては、mapView:viewForOverlay特定のオーバーレイをチェックするのではなく、関数の複雑さを軽減するために渡されるオーバーレイのクラスをチェックできます。そう:

if ([overlay isKindOfClass:[MKPolyline class]])
{
    borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
    borderView.strokeColor = [UIColor blackColor];
    borderView.lineWidth = 1.0;
    return borderView;
}
于 2013-03-28T21:07:25.520 に答える