MKMapView - перерисовка оверлеев наиболее эффективным способом - PullRequest
4 голосов
/ 29 ноября 2011

У меня есть MKMapView с 2 оверлеями.Они представляют 1. Маршрут, который кто-то выбрал.2. Ряд круговых областей интереса.Чтобы обновить одно из наложений, я обновляю их данные, а затем аннулирую их связанное представление:

[(RoutePolyline *)self.overlay appendPolylines:polylines];
MKOverlayPathView *overlayView = (MKOverlayPathView *)[self.mapView viewForOverlay:self.overlay];
[overlayView invalidatePath]; 

Проблема заключается в том, что добавление одной строки к моей RoutePolyline и аннулирование ее связанного представления приводит к тому, что каждое представление наложения будетперерисован примерно в 80 раз.Учитывая, что это происходит при каждом обновлении местоположения, это невероятно дорого.

Вот код из единственного метода в моем RouteOverlayView:

- (void)drawMapRect:(MKMapRect)mapRect
          zoomScale:(MKZoomScale)zoomScale
          inContext:(CGContextRef)context
{
    RoutePolyline *routePolyline = (RoutePolyline *)self.overlay;
    int polylineCount = [routePolyline.polylines count];
    for (int i = 0; i < polylineCount; i++)
    {
        MKPolyline *polyline = [routePolyline.polylines objectAtIndex:i];
        CGPathRef path = [MKUtils newPolyPathWithPolyline:polyline overlayView:self];
        if (path)
        {
            [self applyFillPropertiesToContext:context atZoomScale:zoomScale];
            CGContextBeginPath(context);
            CGContextAddPath(context, path);
            CGContextDrawPath(context, kCGPathStroke);
            [self applyStrokePropertiesToContext:context atZoomScale:zoomScale];
            CGContextBeginPath(context);
            CGContextAddPath(context, path);
            CGContextStrokePath(context);
            CGPathRelease(path);
        }
    }
}

Что может быть причиной этих дополнительных перерисовок?

...