使用MKMap平移时如何加快折线的重新渲染?

问题描述 投票:1回答:1

Polyline at correct sizePolyline re-rendering too big

说明:

我在MKMap上放置了一条折线,放大后,平移操作将在一段时间内显示超大像素化折线,直到将其重新渲染为正确的大小为止。

我尝试过的解决方案:

  • 其他SOF职位已为子类MKPolylineRenderer提供了解决方案,并将其设置为静态大小。此解决方案意味着该线太小而无法在大地图上看到,或者对于小地图来说太大了]]

  • 我已经尝试将其制作成实心折线,如果有任何改进,那就是微不足道。

  • 我已经研究过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!!

正确大小的折线折线重新渲染太大说明:我在MKMap上放置了一条折线,放大后,平移操作将在一段时间内显示超大像素化折线。

objective-c swift mapkit
1个回答
0
投票
经过大量研究,结果证明您无法加快速度。 Apple Maps使用它自己的自定义渲染器,性能更高。对于我们其他人,我们只需要克服滞后。
© www.soinside.com 2019 - 2024. All rights reserved.