私は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);
}
は私が見ている問題のいくつかのスクリーンショットです多く:
半径を変更するときの問題:
地図をズームし続けると、問題は解決しません。マップタイルをリフレッシュした後、オーバーレイがもはや途切れることはなくなりました...
誰もが同様の問題を抱えていたら、私を狂わせるのを助けてください!
私は、元々はboundingMapRectによって影響を受けていると考えましたが、実際にはboundingMapRectを変更すると円のサイズが変わるだけです。残念ながら、私は私の質問で2つのリンクに制限されていますが、オーバーレイをドラッグすると実際には同じマップタイルに沿ってクリッピングが発生します。 'MKMapPointsPerMeterAtLatitude'の不正確さについて私に教えてくれてありがとうございますが、異なるズームスケールではクリッピングが大きく異なります。規模に左右されないようです。 – kudos
私はまだ、誤った 'boundingMapRect'(サイズ変更時のサイズが間違っているか、ドラッグ中に間違っている場所)が、あなたの質問のように正確に現れると主張しています。 「boundingMapRect」が小さすぎると、オーバーレイ全体をレンダリングしないように自分自身を明示できますが、まっすぐに縁取られたクロップが表示されますが、必ずしもそうである必要はありません。マップは矩形のタイルを使用するので、 'boundingMapRect'を使用して、どのタイルを再レンダリングする必要があるかを知ることができます。サイズが間違っているか、間違った場所にある(またはその両方)。 – Rob
@kudos - ジェスチャー中に地図がレンダリングされているように見えますが、 'boundingMapRect'はおそらく時代遅れの値を返しています。あるいは、 'boundingMapRect'が現在の' MKMapRect'を計算するのを確認する必要があるかもしれませんが、そのジェネレーション全体を通して以前の計算された値との和集合を返します。しかし、後で地図をズームアウトするときに、オーバーレイが正しくレンダリングされることに基づいて、結論を導くことを躊躇します。タイルが大きいかもしれません。それはたくさんのことがあります。問題の再現可能な例がなければ、言うことは難しいです。 – Rob