2011-11-25 33 views
5

Tôi đang sử dụng mapkit trên iPhone với iOS 4. Tôi đang sử dụng lớp phủ tùy chỉnh và chế độ xem lớp phủ tùy chỉnh để vẽ hình trên bản đồ. Hiện tại, hình dạng chỉ là hình chữ nhật, nhưng tôi đang lên kế hoạch một cái gì đó tinh vi hơn. Đây là lý do tại sao tôi không sử dụng loại lớp phủ MKPolygon. Đây là mã cho lớp phủ phương pháp xem bản vẽ của tôi:Không thể đột quỵ đường dẫn trên chế độ xem lớp phủ bản đồ

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{ 
    // Clip context to bounding rectangle 
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect]; 
    CGRect boundingRect = [self rectForMapRect:boundingMapRect]; 
    CGContextAddRect(context, boundingRect); 
    CGContextClip(context); 

    // Define shape 
    CGRect shapeRect = CGRectMake(0.5f, 0.5f, boundingRect.size.width - 1.0f, boundingRect.size.height - 1.0f); 

    // Fill 
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f); 
    CGContextFillRect(context, shapeRect); 

    // Stroke 
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f); 
    CGContextSetLineWidth(context, 1.0f); 
    CGContextStrokeRect(context, shapeRect); 
} 

Vấn đề là hình chữ nhật được điền một cách chính xác (để nó xuất hiện rect bounding của họ được thiết lập một cách chính xác), nhưng họ không được vuốt ve. Có ai giúp được không? Cảm ơn!

+0

Mặc dù tôi không biết giải pháp, tôi chỉ muốn thu hút sự chú ý của bạn vào [CGRectInset] (http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/CGGeometry/Reference/reference. html # // apple_ref/c/func/CGRectInset) (thay vì tạo hình chữ nhật bằng 'CGRectMake'). – DarkDust

+0

Chỉ xảy ra với tôi: hình chữ nhật có bị vuốt ve nếu bạn tiếp tục chèn nó? Vì vậy, trước tiên bạn điền vào nó, sau đó bạn inset rect bởi 0,5 khác và sau đó đột quỵ không? – DarkDust

+0

Tìm thấy một câu hỏi khác liên quan đến điều này: http://stackoverflow.com/questions/5274164/custom-mkoverlayview-line-width vì vậy có vẻ như vấn đề là với chiều rộng đường kẻ rộng và có vẻ như tôi phải sửa mã của mình theo cách này : CGContextSetLineWidth (ngữ cảnh, 5.0f/zoomScale); –

Trả lời

2

Như đã báo cáo trong một số nhận xét trước, vấn đề là với chiều rộng đường kẻ. Nói chung, tất cả bản vẽ được tự động thu nhỏ để theo dõi phóng to bản đồ, vì vậy nếu bạn muốn một số chỉ số bản vẽ của mình độc lập với thu phóng, bạn phải chia tỷ lệ này bằng zoomScale.

Đây là mã mới, mà làm việc một cách chính xác trên iPhone của tôi 4:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 
{ 
    // Clip context to bounding rectangle 
    MKMapRect boundingMapRect = [[self overlay] boundingMapRect]; 
    CGRect boundingRect = [self rectForMapRect:boundingMapRect]; 
    CGContextAddRect(context, boundingRect); 
    CGContextClip(context); 

    // Define shape 
    CGRect shapeRect = CGRectInset(boundingRect, 2.0f/zoomScale, 2.0f/zoomScale); 

    // Fill 
    CGContextSetRGBFillColor(context, 0.5f, 0.5f, 0.5f, 0.5f); 
    CGContextFillRect(context, shapeRect); 

    // Stroke 
    CGContextSetRGBStrokeColor(context, 0, 0, 0, 0.75f); 
    CGContextSetLineWidth(context, 4.0f/zoomScale); 
    CGContextStrokeRect(context, shapeRect); 
} 

tôi cũng sẽ báo cáo mã Tôi đang sử dụng trong các lớp phủ để tính toán và trả lại hình chữ nhật bounding, bởi vì tôi nghĩ rằng nó có thể trợ giúp:

-(MKMapRect)boundingMapRect 
{ 
    // Overlay bounds 
    CLLocationCoordinate2D topLeftcoordinate = <the top-left coordinate of overlay>; 
    CLLocationCoordinate2D bottomRightCoordinate = <the bottom-right coordinate of overlay>; 

    // Convert them to map points 
    MKMapPoint topLeftPoint = MKMapPointForCoordinate(topLeftcoordinate); 
    MKMapPoint bottomRightPoint = MKMapPointForCoordinate(bottomRightCoordinate); 

    // Calculate map rect 
    return MKMapRectMake(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x - topLeftPoint.x, topLeftPoint.y - bottomRightPoint.y); 
} 

Cảm ơn tất cả các nhận xét và đề xuất của bạn.

Các vấn đề liên quan