Нарисуйте текст в наложении круга

Я пытаюсь нарисовать некоторые обложки круга, содержащие текст на 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

Являются ли они нормальными? Что мне не хватает?

Спасибо.

Ответ 1

Я считаю, что ваш код работает, и проблема в том, что текст не масштабируется правильно, делая его невидимым.

Масштабируйте размер шрифта на основе zoomScale с помощью функции MKRoadWidthAtZoomScale:

[t drawInRect:overallCGRect withFont:[UIFont fontWithName:@"Arial" 
    size:(10.0 * MKRoadWidthAtZoomScale(zoomScale))] 
    lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];

Также не забудьте использовать цвет текста, отличный от цвета окружности.

Обратите внимание, что использование drawInRect приведет к тому, что текст будет ограничен внутри круга и может быть усечен. Если вы хотите всегда показывать весь текст, вы можете использовать drawAtPoint вместо этого.

Ответ 2

Объединяем ответы здесь и обновляем для 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();
}

Ответ 3

Скорее всего, ваш текст нарисован на прямоугольник, который не отображается.

В первую очередь я попытаюсь напечатать значения как% f вместо% lf, так как эти значения выглядят сумасшедшими. Вы также должны распечатать .size.width и .size.height для двух прямоугольников (mapRect и overallCGRect).

Если это не приведет вас к разумному определению прямоугольника, попробуйте определить CGRect самостоятельно, как CGRectMake(0,0,100,20), и посмотрите, рисует ли текст.

Вы также можете попробовать просто нарисовать заполненный прямоугольник тем же overallCGRect, в который вы вставляете текст.