2014-11-10 12 views
8

Ho una mappa nella mia app in cui si sta spostando in base alla posizione dell'utente. Ho disegnato correttamente una polilinea per l'origine e la destinazione. Utilizzando seguente codicemodifica dinamicamente larghezzaWpth of mkpolyline

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay{ 

    MKPolylineView *view1 = [[MKPolylineView alloc] initWithOverlay:overlay]; 

     view1.lineWidth = 27.0; 
     view1.strokeColor = [UIColor colorWithRed:55.0/255.0 green:168.0/255.0 blue:219.0/255.0 alpha:1]; 

    return view1; 
} 

Ma il mio problema è quando la mappa è in movimento, significa che io sto cambiando regione della mappa come utente si sposta, poi alcuni momenti poligonale non è dimostrato una buona po 'di tempo il suo spettacolo più spesso di dimensioni reali, come si può vedere nell'immagine qui sotto.

sto allegando l'immagine qui sotto, per favore fatemi sapere cosa posso fare per polilinea liscia quando la mappa è in movimento.

enter image description here

EDIT

Come Matt mi ha suggerito di creare una sottoclasse di MKPolylineRenderer e implementare il metodo drawMapRect come di seguito:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{ 


    CGMutablePathRef fullPath = CGPathCreateMutable(); 
    BOOL pathIsEmpty = YES; 

    //merging all the points as entire path 
    for (int i=0;i< self.polyline.pointCount;i++){ 
     CGPoint point = [self pointForMapPoint:self.polyline.points[i]]; 
     if (pathIsEmpty){ 
      CGPathMoveToPoint(fullPath, nil, point.x, point.y); 
      pathIsEmpty = NO; 
     } else { 
      CGPathAddLineToPoint(fullPath, nil, point.x, point.y); 
     } 
    } 

    //get bounding box out of entire path. 
    CGRect pointsRect = CGPathGetBoundingBox(fullPath); 
    CGRect mapRectCG = [self rectForMapRect:mapRect]; 
    //stop any drawing logic, cuz there is no path in current rect. 
    if (!CGRectIntersectsRect(pointsRect, mapRectCG))return; 

    UIColor *darker = [UIColor blackColor]; 
    CGFloat baseWidth = 10/zoomScale; 

    // draw the dark colour thicker 
    CGContextAddPath(context, self.path); 
    CGContextSetStrokeColorWithColor(context, darker.CGColor); 
    CGContextSetLineWidth(context, baseWidth * 1.5); 
    CGContextSetLineCap(context, self.lineCap); 
    CGContextStrokePath(context); 

    // now draw the stroke color with the regular width 
    CGContextAddPath(context, self.path); 
    CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor); 
    CGContextSetLineWidth(context, baseWidth); 
    CGContextSetLineCap(context, self.lineCap); 
    CGContextStrokePath(context); 

    [super drawMapRect:mapRect zoomScale:zoomScale inContext:context]; 
} 

ma lo stesso problema Vedi sotto immagine :

enter image description here

ok, penso che ho avuto problemi, è aggiunto il mio polyline una volta, ma la velocità dell'utente i cambiare il livello di zoom della MKMapView, livello di zoom è cambiato, ma la larghezza della polilinea non è rinfrescare,

SO Come posso modificare la riga della larghezza di mkpolyline in ??

+0

Stesso problema in iOS 10 utilizzando MKPolylineRenderer. Hai trovato una soluzione per questo? –

+0

Ho riscontrato lo stesso problema e non ho ancora trovato alcuna soluzione. – Kumar

+0

Anche io sto affrontando lo stesso problema, qualsiasi soluzione si accorga di gestire la larghezza della polilinea a seconda dello zoom in o dello zoom out @Kumar –

risposta

1

è necessario utilizzare MKPolylineRenderer invece di MKPolylineView

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay { 
    @try { 

     MKPolylineRenderer *renderer = [[[MKPolylineRenderer alloc] initWithOverlay:overlay]; 
     renderer.lineWidth = 27.0; 
     renderer.strokeColor = [UIColor colorWithRed:55.0/255.0 green:168.0/255.0 blue:219.0/255.0 alpha:1]; 

     return renderer; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"exception :%@",exception.debugDescription); 
    } 
} 

Leggere questo:

La classe MKPolylineRenderer fornisce la rappresentazione visiva di un oggetto di sovrapposizione MKPolyline. Questo renderer accarezza solo la linea; non lo riempie. È possibile modificare il colore e altri attributi del disegno del poligono modificando le proprietà ereditate dalla classe genitore. Generalmente usi questa classe così com'è e non la sottoclassi.

From Apple library

La classe MKPolylineView fornisce la rappresentazione visiva di un oggetto annotazione MKPolyline. Questa vista tocca il percorso rappresentato dall'annotazione. (Questa classe non riempie l'area racchiusa dal percorso.) È possibile modificare il colore e gli altri attributi del disegno del percorso modificando le proprietà ereditate dalla classe MKOverlayPathView. Questa classe viene generalmente utilizzata così com'è e non sottoclassata.

From Apple library

+0

Thnks per la risposta, ma sto supportando anche ios6, quindi ho usato quel metodo delegato. – NetDemo

+0

e anch'io ho usato questo mkrenderer ma mi dà anche lo stesso problema. – NetDemo

+0

Sì. Se supporterai iOS 6 che "MKOverlayRenderer" non è disponibile. – Kampai

2

Il problema è che si sta impostando una lineWidth ad una larghezza fissa (una davvero grande larghezza fissa). Questo diventa più grande o più piccolo man mano che la mappa viene ingrandita o ingrandita.

Invece, implementare la propria sottoclasse MKOverlayRenderer e sovrascrivere drawMapRect:zoomScale:inContext:. Riceve un parametro zoomScale e quindi è possibile regolare la larghezza della linea in modo che corrisponda a quale potrebbe essere la scala corrente.

+0

Grazie opaco per la risposta, puoi semplicemente fornire alcuni rif. per l'implementazione di quella classe, sono nuovo in questo. – NetDemo

+0

https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/iOS7bookExamples/bk2ch21p744maps/ch34p1008maps – matt

+0

: thnaks per fornire ref, ma sto ancora ottenendo questo tipo di sfocatura, puoi correggermi per favore in questo. – NetDemo

2

sottoclasse MKPolylineRenderer e sovrascrivere applyStrokePropertiesToContext:atZoomScale: in modo che ignora la scala, e disegna linee a larghezza costante:

@interface ConstantWidthPolylineRenderer : MKPolylineRenderer 
@end 

@implementation ConstantWidthPolylineRenderer 

- (void)applyStrokePropertiesToContext:(CGContextRef)context 
          atZoomScale:(MKZoomScale)zoomScale 
{ 
    [super applyStrokePropertiesToContext:context atZoomScale:zoomScale]; 
    CGContextSetLineWidth(context, self.lineWidth); 
} 

@end 

Ora usarlo e ammirare la sua liscia resa:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay 
{ 
    MKPolyline *polyline = (MKPolyline *)overlay; 
    ConstantWidthPolylineRenderer *renderer = [[ConstantWidthPolylineRenderer alloc] initWithPolyline:polyline]; 
    renderer.strokeColor = [UIColor redColor]; 
    renderer.lineWidth = 40; 
    return renderer; 
} 
+0

Grazie! Ha funzionato, ma ora il problema è: quando eseguo l'ingrandimento o lo zoom. La larghezza della linea è costante. e questo è un grosso problema per me. – Kumar

+0

Non lo so, amico. Forse il tuo renderizzatore personalizzato è a conoscenza del livello di zoom? Sono sicuro che capirai le cose. –

+0

Mi spiace non sono sicuro di come gestire il livello di zoom con la larghezza. Ma ho provato qualche personalizzazione in quel metodo, ma quelle modifiche alla larghezza della riga riproducono lo stesso problema che è stato chiesto in questa discussione. – Kumar

Problemi correlati