如何在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路线走。

我在桌子上敲了一下脑袋将近一个月,然后才发现它为什么随机崩溃如此之多。

我的代码用于聚类,将文本与该聚类中的项目数放置在每个圆圈的中间。

09-03 21:32