Как ускорить рендеринг полилинии при панорамировании с помощью MKMap? - PullRequest
0 голосов
/ 07 февраля 2019

Полилиния правильного размера
Слишком большой повторный рендеринг полилины

Описание:

Я размещаю полилинию наMKMap, после увеличения, действие панорамирования покажет увеличенную пиксельную полилинию в течение некоторого промежутка времени, пока она не отобразит ее в правильном размере.

Решения, которые я пробовал:

  • Другие сообщения SOF предоставили решения для подкласса MKPolylineRenderer и установили его статический размер.Это решение означает, что линия слишком мала, чтобы ее можно было увидеть на больших картах, или слишком большая для маленьких.

  • Я пытался сделать ее сплошной ломаной линией.marginal.

  • Я изучил func applyStrokeProperties(to: CGContext, atZoomScale: MKZoomScale), чтобы изменить размер всей полилинии при каждом изменении масштаба.Создание CGContext оказалось выше моего текущего уровня квалификации, и неясно, приведет ли это к проблемам с производительностью при масштабировании

Примеры кода:


    convenience init(polyline: MKPolyline) {
        self.init(points: polyline.points(), count: polyline.pointCount)
    }

    @objc
    func renderer() -> MKPolylineRenderer {
        let polylineRenderer = MKPolylineRenderer(polyline: self)
        polylineRenderer.lineWidth = 5
        polylineRenderer.strokeColor = .black
        polylineRenderer.lineDashPattern = [0, 10]

        return polylineRenderer
    }
}```

and implementation:
```- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {

    // Return a KML renderer if there is one
    MKOverlayRenderer *kmlRenderer = [SRMapViewController kmlRendererForKmlOverlay:overlay];
    if (kmlRenderer) {
        return kmlRenderer;
    }

    // Return a Route renderer if there is one
    if ([overlay isKindOfClass:[RoutePolyline class]]) {
        MKPolylineRenderer *renderer = [((RoutePolyline *)overlay) renderer];
        return renderer;
    }

    // Return an MKPolyline if we have a UserLocation path
    if ([overlay isKindOfClass:[MKPolyline class]]) {
        MKPolylineRenderer *userLocationPathRenderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
        userLocationPathRenderer.lineWidth = USER_LOCATION_PATH_LINE_WIDTH;
        UIColor *userColor = [self colorForUserLocationLine:overlay];   // color for the user of the UserLocation
        userLocationPathRenderer.strokeColor = userColor;
        return userLocationPathRenderer;
    }

    // find which area is being rendered and return the renderer for it
    MKOverlayRenderer *renderer;
    for (NSString *areaId in self.visibleAreaDict) {
        MKPolygon *areaOverlay = [self overlayForAreaWithId:areaId];
        if (overlay == areaOverlay) {
            renderer = [self rendererForAreaWithId:areaId];
            break;
        }
    }

    NSAssert(renderer, @"ERROR: self.visibleAreaDict is missing a renderer for overlay %@! It should already be created before this method is called", overlay);
    return renderer;
}```

Desired solutions:
 - Hopefully an easy fix to speed up the re-render
 - A good third party library for the polyline
 - A work around to make the problem less visible

Undesired solutions:
 - switch to Google Maps

Thanks!!
...