Нужно ли для 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, но не после этого):
Вот скриншот "изменчивого" пути, который происходит, когда 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" на юг, или увеличив ширину штриха и посмотрев, остается ли линия среза в том же месте. географически.