2011-10-19 41 views
10

Tôi đang cố vẽ một số lớp phủ vòng tròn chứa văn bản trên MKMapView. Tôi đã phân lớp MKCircleView, trong đó tôi đặt sau (dựa trên this), nhưng văn bản không xuất hiện. Các vòng tròn hiển thị chính xác. (Cũng đã thử giải pháp của phản ứng đầu tiên, cùng một kết quả).Vẽ văn bản trong lớp phủ vòng tròn

-(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(); 
} 

Khi gỡ lỗi, tôi nhận được giá trị như thế này

MKC : 43253760.000000, 104071168.000000 ----> 1.776503 , 1.999245 
MKC : 43253760.000000, 104071168.000000 ----> -1.562442 , -2.043090 

Họ có bình thường không? Tôi đang thiếu gì?

Cảm ơn.

+0

Kết hợp điều này với các câu trả lời dưới đây giải quyết câu hỏi của tôi về làm thế nào để vẽ văn bản. Tuy nhiên văn bản của tôi được căn giữa theo chiều ngang nhưng dọc được vẽ ở đầu MKCircleView của tôi. Là của bạn theo chiều dọc và chiều ngang trung tâm? – Diziet

+0

Tôi đã tính vị trí của văn bản sai. Hohum. : P – Diziet

+2

Nếu có ai cần, đây là cách tôi căn giữa văn bản trong vòng tròn, xem xét chiều rộng và chiều cao của văn bản: 'CGSize size = [str sizeWithFont: [UIFont fontWithName: @" Arial "size: 9]]; Trung tâm CGPoint = CGPointMake (circleRect.origin.x + circleRect.size.width /2,circleRect.origin.y + circleRect.size.height/2); CGPoint textstart = CGPointMake (center.x - size.width/2, center.y - size.height/2); ' – Templar

Trả lời

12

Tôi tin rằng mã của bạn đang hoạt động và vấn đề là văn bản không được thu nhỏ đúng cách làm cho nó ẩn đi.

Scale kích thước phông chữ dựa trên zoomScale bằng cách sử dụng chức năng MKRoadWidthAtZoomScale:

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

Ngoài ra hãy chắc chắn sử dụng một màu sắc văn bản đó là khác biệt so với màu vòng tròn cơ bản của.

Lưu ý rằng việc sử dụng drawInRect sẽ dẫn đến văn bản bị giới hạn bên trong vòng kết nối và có thể bị cắt bớt. Nếu bạn muốn luôn hiển thị tất cả văn bản, bạn có thể sử dụng drawAtPoint để thay thế.

+0

Cảm ơn rất nhiều! Nó hoạt động ngay bây giờ :) Tôi quên tính đến zoomlevel. Tôi tính toán trung tâm của vòng tròn và điểm bắt đầu từ dựa trên kích thước văn bản và với drawAtPoint nó xuất hiện hoàn toàn trung tâm. – Templar

2

Rất có thể văn bản của bạn được vẽ thành hình chữ nhật không hiển thị.

Điều đầu tiên tôi sẽ làm là thử in các giá trị dưới dạng% f thay vì% lf, vì các giá trị đó trông thật điên rồ. Bạn cũng nên in ra các số .size.width.size.height cho hai đường dẫn (mapRectoverallCGRect).

Nếu điều đó không dẫn bạn đến định nghĩa hình chữ nhật hợp lý, hãy thử tự định nghĩa một CGRect như CGRectMake(0,0,100,20) và xem văn bản có vẽ hay không.

Bạn cũng có thể thử chỉ cần vẽ hình chữ nhật đã điền vào cùng một overallCGRect mà bạn đang vẽ văn bản của mình.

3

Kết hợp các câu trả lời ở đây và cập nhật cho 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(); 
} 
Các vấn đề liên quan