Нарисуйте текст в круге наложения - PullRequest
10 голосов
/ 19 октября 2011

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

Они нормальные? Что мне не хватает?

Спасибо.

Ответы [ 3 ]

12 голосов
/ 21 октября 2011

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

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

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

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

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

4 голосов
/ 10 сентября 2014

Объединение ответов здесь и обновление для 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 голосов
/ 21 октября 2011

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

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

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

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

...