Создание MKMapSnapshotter с помощью MKPolylineRenderer

Я думал, что MKMapSnapshotters в iOS 7 будет простым способом сделать снимок MKMapView, преимущество в том, что вы можете сделать это без загрузки карты в поле зрения. Хотя кажется, что добавление булавок и наложений требует больше работы (из-за необходимости в основной графике). Видео WWDC дают очень хороший пример создания MKMapSnapshotter с добавлением MKAnnotationView.

Однако для тех, у кого нет большого опыта работы с основной графикой, не совсем очевидно, как создать MKMapSnapshotter из MKPolylineRenderer.

Я пытался сделать это, но путь неточен. Он точно рисует около 10% линии, но затем рисует остальную часть пути прямо.

Вот мой код:

MKMapSnapshotter *snapshotter = [[MKMapSnapshotter alloc] initWithOptions:snapshotOptions];

[snapshotter startWithQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
          completionHandler:^(MKMapSnapshot *snapshot, NSError *error)
{
            if (error == nil)
            {
                UIImage *mapSnapshot = [snapshot image];

                UIGraphicsBeginImageContextWithOptions(mapSnapshot.size,
                                                       YES,
                                                       mapSnapshot.scale);

                [mapSnapshot drawAtPoint:CGPointMake(0.0f, 0.0f)];

                CGContextRef context = UIGraphicsGetCurrentContext();

                //Draw the points from the MKPolylineRenderer in core graphics for mapsnapshotter...
                MKPolylineRenderer *overlay = (MKPolylineRenderer *)[self.mapView rendererForOverlay:[_mapView.overlays lastObject]];

                if (overlay.path)
                {
                    CGFloat zoomScale = 3.0;

                    [overlay applyStrokePropertiesToContext:context
                                                atZoomScale:zoomScale];

                    CGContextAddPath(context, overlay.path);
                    CGContextSetLineJoin(context, kCGLineJoinRound);
                    CGContextSetLineCap(context, kCGLineCapRound);
                    CGContextStrokePath(context);
                }

                UIImage *pathImage = UIGraphicsGetImageFromCurrentImageContext();

                [map addMapIcon:pathImage];
                UIGraphicsEndImageContext();
            }
}];

У кого-нибудь есть хороший рабочий пример того, как это сделать, пожалуйста?


person PostCodeism    schedule 27.03.2014    source источник


Ответы (1)


Просто была такая же проблема, этот код, кажется, работает:

UIImage * res = nil;
UIImage * image = snapshot.image;

UIGraphicsBeginImageContextWithOptions(image.size, YES, image.scale);
[image drawAtPoint:CGPointMake(0, 0)];

CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetStrokeColorWithColor(context,  [COLOR_FLASHBLUE CGColor]);
CGContextSetLineWidth(context,2.0f);
CGContextBeginPath(context);

CLLocationCoordinate2D coordinates[[polyline pointCount]];
[polyline getCoordinates:coordinates range:NSMakeRange(0, [polyline pointCount])];

for(int i=0;i<[polyline pointCount];i++)
{
    CGPoint point = [snapshot pointForCoordinate:coordinates[i]];

    if(i==0)
    {
        CGContextMoveToPoint(context,point.x, point.y);
    }
    else{
        CGContextAddLineToPoint(context,point.x, point.y);

    }
}

CGContextStrokePath(context);

res = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
person Sander    schedule 28.03.2014
comment
Интересно, что вам нужно явно переместить и добавить строку в точку, а не использовать CGContextAddPath. Спасибо, еще не пробовал, но посмотрю :) - person PostCodeism; 29.03.2014
comment
Я не уверен, что вы должны делать это таким образом. Я не знал уровень масштабирования, поэтому пришлось использовать метод pointForCoordiinate. - person Sander; 30.03.2014
comment
Это сработало и для меня. Мне все еще было бы любопытно узнать, почему вместо этого не работает CGContextAddPath ›_‹ - person PostCodeism; 01.04.2014
comment
Какова цель начального [image drawAtPoint:CGPointMake(0, 0)]; ? Кроме того, перед этим я нарисовал некоторые аннотации булавок в виде изображений на снимке, и когда я добавляю линию маршрута, булавки исчезают. Мне нужно делать их в разных контекстах или что-то в этом роде? - person shim; 08.07.2017
comment
О, у меня был дополнительный вызов для рисования (в: CGPoint.zero), когда я удалил этот дополнительный, мои булавки снова появились. Но к чему этот призыв? - person shim; 08.07.2017
comment
@shim, чтобы нарисовать снимок изображения в контексте. Вы, вероятно, перерисовывали свои булавки с исходной картой? - person Sander; 08.07.2017
comment
У меня был дополнительный вызов draw(at), как упоминалось в комментариях выше. Но что делает эта линия? - person shim; 09.07.2017
comment
@shim эта строка рисует снимок карты в графическом контексте. вы делаете это в начале, чтобы остальные ваши команды рисования контекста отображались поверх изображения. - person danneu; 28.10.2018