2011-11-25 33 views
5

Sto usando mapkit su iPhone con iOS 4. Sto usando una sovrapposizione personalizzata e una vista sovrapposizione personalizzata, per disegnare forme sulla mappa. Al momento, le forme sono solo rettangoli, ma sto progettando qualcosa di più sofisticato. Questo è il motivo per cui non sto usando il tipo di sovrapposizione MKPolygon. Questo è il codice per il mio metodo di sovrapposizione vista del disegno:Impossibile tracciato percorso sulla vista sovrapposizione mapkit

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

Il problema è che i rettangoli ottenere compilati correttamente (in modo che appaia la loro delimitazione rect è impostato correttamente), ma non ottengono accarezzò. Qualcuno può aiutare? Grazie!

+0

Mentre non conosco la soluzione, volevo solo attirare la vostra attenzione su [CGRectInset] (http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/CGGeometry/Reference/reference. html # // apple_ref/c/func/CGRectInset) (invece di creare il rettangolo con 'CGRectMake'). – DarkDust

+0

Mi è appena venuto in mente: il rettangolo viene accarezzato se viene ulteriormente inserito? Quindi per prima cosa lo riempi, quindi inserisci il rettangolo di un altro 0,5 e poi lo accarezza? – DarkDust

+0

Ho trovato un'altra domanda relativa a questo: http://stackoverflow.com/questions/5274164/custom-mkoverlayview-line-width quindi sembra che il problema sia dovuto al ridimensionamento della larghezza della linea e sembra che debba risolvere il mio codice in questo modo : CGContextSetLineWidth (context, 5.0f/zoomScale); –

risposta

2

Come riportato in alcuni commenti precedenti, il problema riguarda la larghezza della linea. Più in generale, tutto il disegno viene ridimensionato automaticamente per seguire lo zoom della mappa, quindi se si desidera che alcune metriche del disegno siano indipendenti dallo zoom, è necessario dividerlo per zoom.

Ecco il nuovo codice, che funziona correttamente sul mio iPhone 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); 
} 

Vorrei anche segnalare il codice che sto usando nella sovrapposizione di calcolare e restituire il rettangolo di delimitazione, perché penso che possa aiuto:

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

Grazie a tutti per i vostri commenti e suggerimenti.

Problemi correlati