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