Как мне сделать так, чтобы мой путь больше походил на Apple или Google Dr aws их путь на картах? - PullRequest
0 голосов
/ 27 февраля 2020

Я сделал навигационное приложение, чтобы показать кратчайшее расстояние между двумя точками на графике с узлами. Я рисую путь между каждым узлом, но углы плохо подходят друг к другу, и это выглядит так:

enter image description here

To draw На маршруте я сделал следующее:

   if (ms.path != nil) {
            NodeModel *startNode = nil;
            bool isOverview = [self isOverviewMap];

            for (NodeInPath *endNode in ms.path.allNodes) {
                if (startNode != nil) {
                    if (isOverview || ([startNode.mapId isEqualToString:mapsource.map->mapId] && [endNode.mapId isEqualToString:mapsource.map->mapId])) {

                        CAShapeLayer *elemLayer = [CAShapeLayer layer];

    #ifdef HALL_DEBUG
                        if ([startNode.mapId intValue] == 0 && [endNode.mapId intValue] == 0) {
                            elemLayer.strokeColor = [UIColor redColor].CGColor;
                        } else if ([startNode.mapId intValue] == 0 || [endNode.mapId intValue] == 0) {
                            elemLayer.strokeColor = [UIColor orangeColor].CGColor;
                        } else {
                            if (startNode.kartenelementId.length != 0 || endNode.kartenelementId.length != 0) {
                                elemLayer.strokeColor = [UIColor greenColor].CGColor;
                            } else {
                                elemLayer.strokeColor = [UIColor blueColor].CGColor;
                            }
                        }
    #else
                        elemLayer.strokeColor = [UIColor blueColor].CGColor;
    #endif
                        elemLayer.fillRule    = kCAFillRuleNonZero;
                        elemLayer.position    = CGPointZero;
                        elemLayer.lineWidth   = 30;


                        CGMutablePathRef path = CGPathCreateMutable();

                        if (isOverview) {
                            CGPathMoveToPoint(path, 0, startNode.overviewX, startNode.overviewY);
                            CGPathAddLineToPoint(path, 0, endNode.overviewX, endNode.overviewY);
                        } else if ([startNode.mapId isEqualToString:mapsource.map->mapId] && [endNode.mapId isEqualToString:mapsource.map->mapId]) {
                            CGPathMoveToPoint(path, 0, startNode.mapX, startNode.mapY);
                            CGPathAddLineToPoint(path, 0, endNode.mapX, endNode.mapY);
                        }
                        CGPathCloseSubpath(path);

                        elemLayer.path        = path;
                        CGPathRelease(path);

                        [markerLayer addSublayer:elemLayer];

                        // p1
                        path = CGPathCreateMutable();
                        CAShapeLayer *circleLayer = [CAShapeLayer layer];
                        circleLayer.strokeColor = [UIColor redColor].CGColor;
                        circleLayer.fillColor   = [UIColor redColor].CGColor;
                        circleLayer.fillRule    = kCAFillRuleNonZero;
                        circleLayer.position    = CGPointZero;
                        circleLayer.lineWidth   = 30;
                        circleLayer.path        = path;
                        CGPathRelease(path);

                        CGRect rect;

                        if (isOverview) {
                            rect = CGRectOffset(CGRectMake(startNode.overviewX, startNode.overviewY, 5, 5), -2, -2);
                        } else {
                            rect = CGRectOffset(CGRectMake(startNode.mapX, startNode.mapY, 5, 5), -2, -2);
                        }
                        CGPathAddEllipseInRect((CGMutablePathRef)circleLayer.path, 0, rect);
                        [markerLayer addSublayer:circleLayer];

                        if (endNode == [ms.path.allNodes objectAtIndex:ms.path.allNodes.count - 1]) {
                            // p2
                            path = CGPathCreateMutable();
                            circleLayer = [CAShapeLayer layer];
                            circleLayer.strokeColor = [UIColor redColor].CGColor;
                            circleLayer.fillColor   = [UIColor redColor].CGColor;
                            circleLayer.fillRule    = kCAFillRuleNonZero;
                            circleLayer.position    = CGPointZero;
                            circleLayer.lineWidth   = 30;
                            circleLayer.path        = path;
                            CGPathRelease(path);

                            if (isOverview) {
                                rect = CGRectOffset(CGRectMake(endNode.overviewX, endNode.overviewY, 5, 5), -2, -2);
                            } else {
                                rect = CGRectOffset(CGRectMake(endNode.mapX, endNode.mapY, 5, 5), -2, -2);
                            }
                            CGPathAddEllipseInRect((CGMutablePathRef)circleLayer.path, 0, rect);
                            [markerLayer addSublayer:circleLayer];
                        }

                        if (endNode.description.length > 0) {
                            if (isOverview) {
                                rect = CGRectOffset(CGRectMake(endNode.overviewX, endNode.overviewY, 5, 5), -2, -2);
                            } else {
                                rect = CGRectOffset(CGRectMake(endNode.mapX, endNode.mapY, 5, 5), -2, -2);
                            }
                            [self addMarkerAtPosition:CGPointMake(rect.origin.x + rect.size.width/2, rect.origin.y + rect.size.height/2) withTitle:endNode.description favorite:false];
                        }
                    }
                }
                startNode = endNode;
            }
        }

Есть идеи, как сделать так, чтобы это больше походило на карты apple или google maps? Или, по крайней мере, чтобы углы хорошо подходили друг к другу.

1 Ответ

0 голосов
/ 27 февраля 2020

Были бы заглавные буквы округлой формы? Попробуйте это ... также установите соединение линий в округлое, так как это сделает сегменты линии на том же пути также лучше.

CAShapeLayer *elemLayer = [CAShapeLayer layer];
elemLayer.lineCap = kCALineCapRound;
elemLayer.lineJoin = kCALineJoinRound;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...