Полилиния правильного размера
Слишком большой повторный рендеринг полилины
Описание:
Я размещаю полилинию на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!!