我正在尝试在MKMapView上绘制一些包含文本的圆形叠加层。 我已经将MKCircleView子类化了,其中我放了以下内容(基于this),但文本没有出现。圆圈正确显示。 (也尝试了第一个响应的解决方案,结果相同)。
-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
[super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
NSString * t= @"XXXXX\nXXXX" ;
UIGraphicsPushContext(context);
CGContextSaveGState(context);
[[UIColor redColor] set];
CGRect overallCGRect = [self rectForMapRect:[self.overlay boundingMapRect]];
NSLog(@"MKC : %lf, %lf ----> %lf , %lf ", mapRect.origin.x ,mapRect.origin.y , overallCGRect.origin.x, overallCGRect.origin.y);
[t drawInRect:overallCGRect withFont:[UIFont fontWithName:@"Arial" size:10.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
CGContextRestoreGState(context);
UIGraphicsPopContext();
}
调试时,我得到像这样的值
MKC : 43253760.000000, 104071168.000000 ----> 1.776503 , 1.999245
MKC : 43253760.000000, 104071168.000000 ----> -1.562442 , -2.043090
他们是正常的吗?我错过了什么?
感谢。
答案 0 :(得分:12)
我相信您的代码正在运行,问题是文本没有正确缩放,使其无形。
使用zoomScale
函数根据MKRoadWidthAtZoomScale
缩放字体大小:
[t drawInRect:overallCGRect withFont:[UIFont fontWithName:@"Arial"
size:(10.0 * MKRoadWidthAtZoomScale(zoomScale))]
lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
还要确保使用与底层圆圈颜色不同的文字颜色。
请注意,使用drawInRect
会导致文本被限制在圈内,并可能会被截断。如果您想要始终显示所有文字,可以改用drawAtPoint
。
答案 1 :(得分:4)
将答案组合在一起并更新IOS7:
-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
[super drawMapRect:mapRect zoomScale:zoomScale inContext:context];
UIGraphicsPushContext(context);
CGContextSaveGState(context);
[[UIColor blueColor] set];
NSDictionary *fontAttributes = @{NSFontAttributeName:[UIFont systemFontOfSize:10.0f * MKRoadWidthAtZoomScale(zoomScale)]};
CGSize size = [[[self overlay] title] sizeWithAttributes:fontAttributes];
CGFloat height = ceilf(size.height);
CGFloat width = ceilf(size.width);
CGRect circleRect = [self rectForMapRect:[self.overlay boundingMapRect]];
CGPoint center = CGPointMake(circleRect.origin.x + circleRect.size.width /2, circleRect.origin.y + circleRect.size.height /2);
CGPoint textstart = CGPointMake(center.x - width/2, center.y - height /2 );
[[[self overlay] title] drawAtPoint:textstart withAttributes:fontAttributes];
CGContextRestoreGState(context);
UIGraphicsPopContext();
}
答案 2 :(得分:2)
您的文字最有可能被绘制为不可见的矩形。
我要做的第一件事是尝试将值打印为%f而不是%lf,因为这些值看起来很疯狂。您还应打印.size.width
和.size.height
两个字段(mapRect
和overallCGRect
)。
如果这不能引导您进行合理的矩形定义,那么请尝试自己定义CGRect,如CGRectMake(0,0,100,20)
,并查看文本是否绘制。
您还可以尝试将填充的矩形绘制为与绘制文本相同的overallCGRect
。