Вопрос по ios – Есть ли способ добавить текст с помощью Paths Drawing

5

У меня есть пользовательский вид карты, который наследуется от MKOverlayPathView. Мне нужен этот пользовательский вид для отображения круга, линии и текста.

Мне уже удалось нарисовать круг и линию, используя функции рисования контуров CGPathAddArc и CGPathAddLineToPoint.

Тем не менее, мне все еще нужно добавить текст.

Я пытался добавить текст, используя

 [text drawAtPoint:centerPoint withFont:font];

но я получил неверную контекстную ошибку.

любая идея?

Ваш Ответ

2   ответа
1

Толкая контекст сUIGraphicsPushContext создал проблему для меня. Напомним, что методdrawMapRect:zoomScale:inContext: вызывается из разных потоков одновременно, поэтому мне пришлось синхронизировать кусок кода, начиная сUIGraphicsPushContext называется внизUIGraphicsPopContext вызов.

Также при расчете размера шрифта, как в[UIFont systemFontOfSize:(5.0 * roadWidth)] следует принять во внимание[UIScreen mainScreen].scaleкоторый для iPad, iPad2, iPhone3 является1 а для iPhone4 - 5 и iPad3 есть2, В противном случае размер текста будет отличаться от iPad2 до iPad3.

Так что для меня все закончилось так:[UIFont boldSystemFontOfSize:(6.0f * [UIScreen mainScreen].scale * roadWidth)]

8

СMKOverlayPathViewЯ думаю, что самый простой способ добавить текст, это переопределитьdrawMapRect:zoomScale:inContext: и поместите туда путь и текст для рисования (и ничего не делайте или не выполняйтеcreatePath).

Но если вы собираетесь использоватьdrawMapRect в любом случае, вы можете просто переключиться на подклассMKOverlayView вместоMKOverlayPathView.

СMKOverlayViewпереопределитьdrawMapRect:zoomScale:inContext: метод и нарисуйте круг, используяCGContextAddArc (или жеCGContextAddEllipseInRect или жеCGPathAddArc).

Вы можете нарисовать текст, используяdrawAtPoint в этом методе, который будет иметь необходимоеcontext.

Например:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    //calculate CG values from circle coordinate and radius...
    CLLocationCoordinate2D center = circle_overlay_center_coordinate_here;

    CGPoint centerPoint = 
        [self pointForMapPoint:MKMapPointForCoordinate(center)];

    CGFloat radius = MKMapPointsPerMeterAtLatitude(center.latitude) * 
                         circle_overlay_radius_here;

    CGFloat roadWidth = MKRoadWidthAtZoomScale(zoomScale);

    //draw the circle...
    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
    CGContextSetFillColorWithColor(context, [[UIColor blueColor] colorWithAlphaComponent:0.2].CGColor);
    CGContextSetLineWidth(context, roadWidth);
    CGContextAddArc(context, centerPoint.x, centerPoint.y, radius, 0, 2 * M_PI, true);
    CGContextDrawPath(context, kCGPathFillStroke);

    //draw the text...
    NSString *text = @"Hello";
    UIGraphicsPushContext(context);
    [[UIColor redColor] set];
    [text drawAtPoint:centerPoint 
             withFont:[UIFont systemFontOfSize:(5.0 * roadWidth)]];
    UIGraphicsPopContext();
}

По поводу комментария в другом ответе ...

Когда центральная координата или радиус (или любой другой)MKOverlay изменения, вы можете сделатьMKOverlayView & Quot; ход & Quot; позвонив по телефонуsetNeedsDisplayInMapRect: на нем (вместо удаления и добавления оверлея снова). (При использованииMKOverlayPathView, ты можешь позвонитьinvalidatePath вместо.)

При звонкеsetNeedsDisplayInMapRect:Вы можете передатьboundingMapRect наложения для прямоугольного параметра карты.

В примере приложения LocationReminders из WWDC 2010 представление наложения использует KVO для наблюдения за изменениями в связанномMKOverlay и заставляет себя двигаться всякий раз, когда обнаруживает изменение в свойствах круга, но вы можете отслеживать изменения другими способами и вызыватьsetNeedsDisplayInMapRect: явно снаружи вид наложения.

(In a comment on another answer I did mention using MKOverlayPathView and that is how the LocationReminders app implements a moving circle overlay view. But I should have mentioned how you can also use MKOverlayView to draw a circle. Sorry about that.)

Error: User Rate Limit Exceededstackoverflow.com/questions/8564013/…Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded user836026

Похожие вопросы