2014-11-10 9 views
8

Ich habe Karte in meiner App, in der sich wie Benutzer Standort bewegt. Ich habe erfolgreich eine Polylinie für Quelle und Ziel gezeichnet. Mit folgenden Codedynamisch ändern LineWidth von 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; 
} 

Aber mein Problem ist, wenn Karte bewegt, ich meine Region Karte als Benutzer bewegt mich zu ändern, dann einige Male Linienzug ist nicht gut einige Zeit seine als Istmaß dicker gezeigt, wie Sie können sehen Sie in Bild unten.

Ich füge das Bild unten an, bitte lassen Sie mich wissen, was ich für glatte Polylinie tun kann, wenn sich die Karte bewegt.

enter image description here

EDIT

Als Matt schlug ich eine Unterklasse von MKPolylineRenderer erstellen und drawMapRect Methode wie unten implementieren:

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

aber die gleiche Problem Bild unten ansehen :

enter image description here

ok, ich glaube, ich habe Problem, meine Linienzug einmal hinzugefügt, aber als Geschwindigkeit des Benutzers i Zoomstufe MKMapView geändert wird, wird Zoomstufe geändert, aber Polylinienbreite aktualisieren nicht,

SO Wie kann ich dynamisch ändern lineWidth von mkpolyline ??

+0

Die gleiche Problem in iOS 10 Verwenden von MKPolylineRenderer. Hast du eine Lösung dafür gefunden? –

+0

Ich stehe vor demselben Problem und habe noch keine Lösung gefunden. – Kumar

+0

Ich bin auch vor demselben Problem, jede Lösung herauszufinden, Polyline-Breite zu verwalten, je nach Zoom in oder verkleinern @Kumar –

Antwort

1

Sie müssen MKPolylineRenderer verwenden statt 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); 
    } 
} 

Lesen Sie dieses:

Die MKPolylineRenderer-Klasse stellt die visuelle Darstellung für ein MKPolyline Overlay-Objekt. Dieser Renderer streicht nur über die Linie. es füllt es nicht aus. Sie können die Farbe und andere Zeichenattribute des Polygons ändern, indem Sie die von der übergeordneten Klasse geerbten Eigenschaften ändern. Normalerweise verwenden Sie diese Klasse als solche und untergliedern sie nicht.

From Apple library

Die MKPolylineView-Klasse stellt die visuelle Darstellung für eine MKPolyline Annotierungsobjekt. Diese Ansicht streicht den Pfad, der von der Annotation dargestellt wird. (Diese Klasse füllt nicht den durch den Pfad eingeschlossenen Bereich.) Sie können die Farbe und andere Zeichenattribute des Pfads ändern, indem Sie die von der MKOverlayPathView-Klasse geerbten Eigenschaften ändern. Diese Klasse wird normalerweise unverändert verwendet und nicht unterklassifiziert.

From Apple library

+0

Thnks für die Antwort, aber ich unterstütze auch ios6, also habe ich diese Delegate-Methode verwendet. – NetDemo

+0

und ich habe auch diesen mkrenderer, aber es gibt mir auch dasselbe Problem. – NetDemo

+0

Ja. Wenn Sie iOS 6 als "MKOverlayRenderer" unterstützen, ist dies nicht möglich. – Kampai

2

Das Problem ist, dass Sie Ihre lineWidth bei einer festen Breite (eine wirklich große feste Breite) setzen. Dies wird größer oder kleiner, wenn die Karte größer oder kleiner gezoomt wird.Verwenden Sie stattdessen eine eigene MKOverlayRenderer-Unterklasse, und überschreiben Sie drawMapRect:zoomScale:inContext:. Es erhält einen zoomScale Parameter, und so können Sie die Breite Ihrer Linie anpassen, um gut zu sehen, was die aktuelle Skala sein kann.

+0

Dank matt für die Antwort, können Sie nur einige ref. Für die Implementierung dieser Klasse bin ich neu in diesem Bereich. – NetDemo

+0

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

+0

: thnaks für ref, aber immer noch bekomme ich diese Art von Unschärfe, können Sie mich bitte korrigieren in diesem. – NetDemo

2

Subclass MKPolylineRenderer und außer Kraft setzen applyStrokePropertiesToContext:atZoomScale: so, dass sie die Skala ignoriert und ziehen Linien mit konstanter Breite:

@interface ConstantWidthPolylineRenderer : MKPolylineRenderer 
@end 

@implementation ConstantWidthPolylineRenderer 

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

@end 

es jetzt verwenden und bewundern sein glattes Rendering:

- (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

Danke! Das hat funktioniert, aber jetzt ist das Problem, wenn ich zoome oder herauszoom. Linienbreite ist konstante Breite. und das ist ein großes Problem für mich. – Kumar

+0

Ich weiß es nicht, Mann. Teilen Sie Ihrem benutzerdefinierten Renderer die Zoomstufe mit? Ich bin sicher, du wirst es herausfinden. –

+0

Entschuldigung, ich bin nicht sicher, wie man die Zoomstufe mit der Breite verwaltet. Aber ich habe einige Anpassungen in dieser Methode versucht, aber diese Zeilenbreitenänderungen reproduzieren das gleiche Problem, das in diesem Thread gestellt wurde. – Kumar