如何在MKCircleview中绘制文本?我必须在MKMapview的叠加层上打印文本。可能吗?
最佳答案
在我的MKOverlayView覆盖视图子类的这一部分中:
- (void)drawMapRect:(MKMapRect)mapRect
zoomScale:(MKZoomScale)zoomScale
inContext:(CGContextRef)context
您应该这样做/ something /:
CGContextSetTextMatrix(context, CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0));
// Setup text rendering stuff.
CGFloat fontHeight = rect.size.height/2.0f;
CGContextSelectFont(context, "Thonburi", fontHeight, kCGEncodingMacRoman);
CGContextSetRGBFillColor(context, 0, 0, 0, 1);
CGContextSetRGBStrokeColor(context, 0, 0, 0, 1);
// Set string.
const char *text = [[NSString stringWithFormat:@"%d",clusters[i].count] UTF8String];
int len = strlen(text);
// Render text invisible.
CGContextSetTextDrawingMode(context, kCGTextInvisible);
CGContextShowTextAtPoint(context,
0,
0,
text,
strlen(text));
// Get actual point it was renderered.
CGPoint pt = CGContextGetTextPosition(context);
// Set text to visible.
CGContextSetTextDrawingMode(context, kCGTextFillStroke);
// Actually render text.
CGContextShowTextAtPoint(context,
rect.origin.x + (0.5f * rect.size.width) - (0.5f * pt.x), // Origin + half the width - half the width of text == center aligned text?
rect.origin.y + (1.25f * fontHeight), // Hack. 1 1/4 font height (which is half rect height) == center vert. aligned text.
text,
len);
这将使文本居中于圆的中心。
有关上述代码的一些警告...实际上来自MKOverlayPathView的子类,在该子类中,我在叠加视图上的不同位置绘制了许多圆圈,因此需要一种相当动态的方法在正确的位置绘制文本。因此,代码对于您而言可能不会是解决方案的下降,并且比您实际需要的要复杂一些。但是,它应该为您指明正确的方向。
请记住,在mapkit上拥有多个叠加视图是一条通往疯狂的道路,因为这些图层会消耗越来越多的ram,从而导致随机崩溃和堆栈跟踪。因此,如果您有少量的叠加层,我建议您也沿MKOverlayPathView路线走。
我在桌子上敲了一下脑袋将近一个月,然后才发现它为什么随机崩溃如此之多。
我的代码用于聚类,将文本与该聚类中的项目数放置在每个圆圈的中间。