MKCircleview图纸

时间:2010-07-19 09:03:03

标签: iphone objective-c xcode

如何在MKCircleview中绘制文本?我必须在MKMapview的叠加层上打印文本。有可能吗?

1 个答案:

答案 0 :(得分:1)

在我的覆盖视图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路线前进。

我把头撞在桌子上差不多一个月才发现为什么它会随机发生这么大的崩溃。

我的代码用于群集,将文本放在每个圆圈的中间,并包含该群集中的项目数。