マップキットオーバーレイビューでパスをストロークできません

私はiOS 4でiPhone上でmapkitを使用しています。 私はカスタムオーバーレイとカスタムオーバーレイビューを使用して、マップ上に図形を描画しています。 現時点では、形状は長方形ですが、私はより洗練されたものを計画しています。これが私がMKPolygonオーバーレイタイプを使用していない理由です。 これは私のオーバーレイビュー描画メソッドのコードです:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
   //Clip context to bounding rectangle
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect];
    CGRect boundingRect = [self rectForMapRect:boundingMapRect];
    CGContextAddRect(context, boundingRect);
    CGContextClip(context);

   //Define shape
    CGRect shapeRect = CGRectMake(0.5f, 0.5f, boundingRect.size.width - 1.0f, boundingRect.size.height - 1.0f);

   //Fill
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f);
    CGContextFillRect(context, shapeRect);

   //Stroke
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f);
    CGContextSetLineWidth(context, 1.0f);
    CGContextStrokeRect(context, shapeRect);
}

問題は、四角形が正しく塗りつぶされていることです(境界矩形が正しく設定されているように見えます)。しかし、矩形はストロークしません。 誰も助けることができますか? ありがとう!

5
これに関連する別の質問が見つかりました: stackoverflow.com/questions/5274164/&hellip ; したがって、問題は線幅のスケーリングと思われ、私のコードをこのように修正しなければならないようです:CGContextSetLineWidth(context、5.0f/zoomScale);
追加された 著者 Giorgio Barchiesi,
私はまた、境界矩形の起点が0でないことを発見したので、私のコードに対する別の修正は次のとおりです。CGRect shapeRect = CGRectMake(boundingRect.origin.x + 0.5f、boundingRect.origin.y + 0.5f、boundingRect.size.width - 1.0f、boundingRect.size.height - 1.0f);
追加された 著者 Giorgio Barchiesi,
CGRectInset(boundingRect、2.5f/zoomScale、2.5f/zoomScale); @DarkDustはCGRectInsetについて正しいです。この方法では、挿入図も正しくスケーリングされます!もう少し試してみましょう。私は答えを書くつもりです。ありがとうございました。
追加された 著者 Giorgio Barchiesi,
ソリューションがわからないのですが、 CGRectInset を使用します。
追加された 著者 DarkDust,
ちょうど私に起こった:あなたはそれをさらにインセットすると、四角形はストロークされますか?だから最初にあなたはそれを塗りつぶし、その後、別の0.5でrectを差し込み、そしてそれを打ちます。
追加された 著者 DarkDust,
次に、解を説明する解答を書いてそれを受け入れるべきです。
追加された 著者 DarkDust,

1 答え

いくつかの以前のコメントで報告されているように、問題は線幅にあります。より一般的には、すべての描画がマップのズームに合わせて自動的にスケーリングされるため、一部の描画メトリックをズームに依存しないようにするには、zoomScaleで分割する必要があります。

ここで私のiPhone 4で正しく動作する新しいコードです:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
   //Clip context to bounding rectangle
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect];
    CGRect boundingRect = [self rectForMapRect:boundingMapRect];
    CGContextAddRect(context, boundingRect);
    CGContextClip(context);

   //Define shape
    CGRect shapeRect = CGRectInset(boundingRect, 2.0f/zoomScale, 2.0f/zoomScale);

   //Fill
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f);
    CGContextFillRect(context, shapeRect);

   //Stroke
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f);
    CGContextSetLineWidth(context, 4.0f/zoomScale);
    CGContextStrokeRect(context, shapeRect);
}

私は、私がそれが助けることができると思うので、私がオーバーレイで使用しているコードを報告して、境界矩形を計算して返します:

-(MKMapRect)boundingMapRect
{
   //Overlay bounds
    CLLocationCoordinate2D topLeftcoordinate = <the top-left coordinate of overlay>;
    CLLocationCoordinate2D bottomRightCoordinate = <the bottom-right coordinate of overlay>;

   //Convert them to map points
    MKMapPoint topLeftPoint = MKMapPointForCoordinate(topLeftcoordinate);
    MKMapPoint bottomRightPoint = MKMapPointForCoordinate(bottomRightCoordinate);

   //Calculate map rect
    return MKMapRectMake(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x - topLeftPoint.x, topLeftPoint.y - bottomRightPoint.y);
}

あなたのコメントと提案に感謝します。

2
追加された