Нужно ли для MKOverlayPathView использовать drawMapRect?

У меня есть некоторые несоответствия, изменяющие пример Breadcrumb, чтобы CrumbPathView был подклассами из MKOverlayPathView (как это должно быть), а не подклассами из MKOverlayView.

Проблема в том, что документы ограничены в разнице в том, как эти 2 должны быть реализованы. Для подкласса MKOverlayPathView рекомендуется использовать:

- createPath
- applyStrokePropertiesToContext:atZoomScale:
- strokePath:inContext:

Но это вместо drawMapRect, или в дополнение к? Вряд ли это будет чем-то особенным, потому что оба будут использоваться для похожих реализаций. Но использование его вместо drawMapRect оставляет строку прерывистой и прерывистой.

Изо всех сил пытаясь найти реальные примеры создания подклассов MKOverlayPathView... есть ли смысл?

UPDATE - модифицированный код из drawMapRect, до того, что должно работать:

- (void)createPath
{
    CrumbPath *crumbs = (CrumbPath *)(self.overlay);

    CGMutablePathRef newPath = [self createPathForPoints:crumbs.points
                                    pointCount:crumbs.pointCount];

    if (newPath != nil) {
        CGPathAddPath(newPath, NULL, self.path);        
        [self setPath:newPath];
    }

    CGPathRelease(newPath);
}


- (void)applyStrokePropertiesToContext:(CGContextRef)context atZoomScale:(MKZoomScale)zoomScale
{
    CGContextSetStrokeColorWithColor(context, [[UIColor greenColor] CGColor]);

    CGFloat lineWidth = MKRoadWidthAtZoomScale(zoomScale);
    CGContextSetLineWidth(context, lineWidth);

    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextSetLineCap(context, kCGLineCapRound);
}


- (void)strokePath:(CGPathRef)path inContext:(CGContextRef)context
{
    CGContextAddPath(context, path);
    CGContextStrokePath(context);

    [self setPath:path];
}

Это рисует начальную линию, но не может продолжить линию... это не добавляет путь. Я подтвердил, что applyStrokePropertiesToContext и strokePath вызываются при каждом новом местоположении.

Вот скриншот полученной ломаной линии (она рисует для createPath, но не после этого):

Пример крошки с createPath вместо drawMapRect

Вот скриншот "изменчивого" пути, который происходит, когда drawMapRect включен с createPath:

Сломанный путь к карте

1 ответ

Не видя больше вашего кода, я думаю, но здесь идет.

Я подозреваю, что путь разбит на сегменты, A->B, C->D, E->F, а не путь с точками A,B,C,D, E и F. Чтобы быть уверенным в этом, мы бы нужно посмотреть, что происходит с self.overlay и сбрасывается ли он в любой момент.

В strokePath Ты устанавливаешь self.path быть тем, кого поглаживают. Я сомневаюсь, что это хорошая идея, поскольку поглаживание может произойти в любое время, как viewForAnnotations,

Что касается изменчивости, то это может быть побочный эффект или плохой расчет границ со стороны Apple. Если ваш лайк заканчивается у границы тайла, который Apple использует для покрытия карты, он, вероятно, попросит карту нарисовать ту, в которой находится линия. Но ваша ширина хода распространяется на соседнюю плитку, которая не была нарисована. Я догадываюсь снова, но вы можете проверить это, переместив точку, находящуюся к северу от W в "Queen St W" на юг, или увеличив ширину штриха и посмотрев, остается ли линия среза в том же месте. географически.

Другие вопросы по тегам