2017-03-09 16 views
0

私はiOS開発が初めてで、MKOverlayを使用するiOS6のコードを移植するのに苦労している。MKOverlayレンダリング時にMKOverlayRendererが途切れるが、ズームアウトで固定

オーバーレイの半径または座標が変更されると、レンダラーはリアルタイムで表示を更新する必要があります。

この部分はうまくいきますが、オーバーレイをあまりドラッグすると境界に達してレンダリングが途切れてしまいます。私はこの動作についてのドキュメントやヘルプを見つけることができません。あまりにもオーバーレイをドラッグしたとき

問題:CircleOverlayクラスで

- (id)initWithOverlay:(id<MKOverlay>)overlay 
{ 
    self = [super initWithOverlay:overlay]; 
    if (self) { 
     CircleZone *bOverlay = (CircleZone *)overlay; 
     [RACObserve(bOverlay, coordinate) subscribeNext:^(id x) { 
      [self setNeedsDisplay]; 
     }]; 
     [RACObserve(bOverlay, radius) subscribeNext:^(id x) { 
      [self setNeedsDisplay]; 
     }]; 
    } 
    return self; 
} 

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{ 
    CGRect rect = [self rectForMapRect:[self.overlay boundingMapRect]]; 

    CGContextSaveGState(context); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextSetFillColorSpace(context, colorSpace); 
    CGColorSpaceRelease(colorSpace); 

    CGContextSetBlendMode(context, kCGBlendModeCopy); 

    CGContextSetFillColor(context, color); 
    CGContextSetAllowsAntialiasing(context, YES); 

    // outline 
    { 
     CGContextSetAlpha(context, 0.8); 
     CGContextFillEllipseInRect(context, rect); 
    } 

    // red 
    { 
     CGContextSetAlpha(context, 0.5); 
     CGRect ellipseRect = CGRectInset(rect, 0.01 * rect.size.width/2, 0.01 * rect.size.height/2); 
     CGContextFillEllipseInRect(context, ellipseRect); 
    } 

    CGContextRestoreGState(cox); 
} 

CircleOverlayRendererクラスで

ここ

- (MKMapRect)boundingMapRect 
{ 
    MKMapPoint center = MKMapPointForCoordinate(self.coordinate); 
    double mapPointsPerMeter = MKMapPointsPerMeterAtLatitude(self.coordinate.latitude); 
    double mapPointsRadius = _radius * mapPointsPerMeter; 

    return MKMapRectMake(center.x - mapPointsRadius, center.y - mapPointsRadius, 
         mapPointsRadius * 2.0, mapPointsRadius * 2.0); 
} 

は私が見ている問題のいくつかのスクリーンショットです多く: Problem when dragging overlay too much

半径を変更するときの問題: Problem when changing the radius

地図をズームし続けると、問題は解決しません。マップタイルをリフレッシュした後、オーバーレイがもはや途切れることはなくなりました...

誰もが同様の問題を抱えていたら、私を狂わせるのを助けてください!

答えて

0

radiusの例を見ると、そのクロッピング方法を考えればboundingMapRectと思われます。 boundingMapRectの実装を見ると、MKMapPointsPerMeterAtLatitude(大領域を見ているとき)に依存することは心配です。この機能は、たとえば、他の座標から10メートルの座標をどこに配置するかを調べる場合などに便利ですが、実際に大きなスパンを見ると必ずしもうまく機能するとは限りません。

代わりに、MKCoordinateRegionの円がある場所を取得し、それをMKMapRectに変換するものを提案してもよいでしょう。あなたはそれが優雅に180度子午線の交差点と円が含まれる北極を扱うことを確認するためにこれを微調整する必要があります

- (MKMapRect)boundingMapRect { 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(self.coordinate, _radius * 2, _radius * 2); 

    CLLocationCoordinate2D upperLeftCoordinate = CLLocationCoordinate2DMake(region.center.latitude - region.span.latitudeDelta/2, region.center.longitude - region.span.longitudeDelta/2); 
    CLLocationCoordinate2D lowerRightCoordinate = CLLocationCoordinate2DMake(region.center.latitude + region.span.latitudeDelta/2, region.center.longitude + region.span.longitudeDelta/2); 

    MKMapPoint upperLeft = MKMapPointForCoordinate(upperLeftCoordinate); 
    MKMapPoint lowerRight = MKMapPointForCoordinate(lowerRightCoordinate); 

    return MKMapRectMake(MIN(upperLeft.x, lowerRight.x), 
         MIN(upperLeft.y, lowerRight.y), 
         ABS(upperLeft.x - lowerRight.x), 
         ABS(upperLeft.y - lowerRight.y)); 
} 

が、それは基本的な考え方を示しています:のような単純な実装が見えるかもしれませんゲット円の場合はMKCoordinateRegionを入力し、MKMapRectに変換します。

+0

私は、元々はboundingMapRectによって影響を受けていると考えましたが、実際にはboundingMapRectを変更すると円のサイズが変わるだけです。残念ながら、私は私の質問で2つのリンクに制限されていますが、オーバーレイをドラッグすると実際には同じマップタイルに沿ってクリッピングが発生します。 'MKMapPointsPerMeterAtLatitude'の不正確さについて私に教えてくれてありがとうございますが、異なるズームスケールではクリッピングが大きく異なります。規模に左右されないようです。 – kudos

+0

私はまだ、誤った 'boundingMapRect'(サイズ変更時のサイズが間違っているか、ドラッグ中に間違っている場所)が、あなたの質問のように正確に現れると主張しています。 「boundingMapRect」が小さすぎると、オーバーレイ全体をレンダリングしないように自分自身を明示できますが、まっすぐに縁取られたクロップが表示されますが、必ずしもそうである必要はありません。マップは矩形のタイルを使用するので、 'boundingMapRect'を使用して、どのタイルを再レンダリングする必要があるかを知ることができます。サイズが間違っているか、間違った場所にある(またはその両方)。 – Rob

+0

@kudos - ジェスチャー中に地図がレンダリングされているように見えますが、 'boundingMapRect'はおそらく時代遅れの値を返しています。あるいは、 'boundingMapRect'が現在の' MKMapRect'を計算するのを確認する必要があるかもしれませんが、そのジェネレーション全体を通して以前の計算された値との和集合を返します。しかし、後で地図をズームアウトするときに、オーバーレイが正しくレンダリングされることに基づいて、結論を導くことを躊躇します。タイルが大きいかもしれません。それはたくさんのことがあります。問題の再現可能な例がなければ、言うことは難しいです。 – Rob

関連する問題