在iOS 7中,您可以使用MapKit框架制作地图的静态快照。如果您想向某人发送带有位置信息的电子邮件,则非常有用。我唯一缺少的是:如何在该快照上绘制MKPolyline?
答案 0 :(得分:7)
这是:
- (UIImage *)drawRoute:(MKPolyline *)polyline onSnapshot:(MKMapSnapshot *)snapShot withColor:(UIColor *)lineColor {
UIGraphicsBeginImageContext(snapShot.image.size);
CGRect rectForImage = CGRectMake(0, 0, snapShot.image.size.width, snapShot.image.size.height);
// Draw map
[snapShot.image drawInRect:rectForImage];
// Get points in the snapshot from the snapshot
int lastPointIndex;
int firstPointIndex = 0;
BOOL isfirstPoint = NO;
NSMutableArray *pointsToDraw = [NSMutableArray array];
for (int i = 0; i < polyline.pointCount; i++){
MKMapPoint point = polyline.points[i];
CLLocationCoordinate2D pointCoord = MKCoordinateForMapPoint(point);
CGPoint pointInSnapshot = [snapShot pointForCoordinate:pointCoord];
if (CGRectContainsPoint(rectForImage, pointInSnapshot)) {
[pointsToDraw addObject:[NSValue valueWithCGPoint:pointInSnapshot]];
lastPointIndex = i;
if (i == 0)
firstPointIndex = YES;
if (!isfirstPoint) {
isfirstPoint = YES;
firstPointIndex = i;
}
}
}
// Adding the first point on the outside too so we have a nice path
if (lastPointIndex+1 <= polyline.pointCount {
MKMapPoint point = polyline.points[lastPointIndex+1];
CLLocationCoordinate2D pointCoord = MKCoordinateForMapPoint(point);
CGPoint pointInSnapshot = [snapShot pointForCoordinate:pointCoord];
[pointsToDraw addObject:[NSValue valueWithCGPoint:pointInSnapshot]];
}
// Adding the point before the first point in the map as well (if needed) to have nice path
if (firstPointIndex != 0) {
MKMapPoint point = polyline.points[firstPointIndex-1];
CLLocationCoordinate2D pointCoord = MKCoordinateForMapPoint(point);
CGPoint pointInSnapshot = [snapShot pointForCoordinate:pointCoord];
[pointsToDraw insertObject:[NSValue valueWithCGPoint:pointInSnapshot] atIndex:0];
}
// Draw that points
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 3.0);
for (NSValue *point in pointsToDraw){
CGPoint pointToDraw = [point CGPointValue];
if ([pointsToDraw indexOfObject:point] == 0){
CGContextMoveToPoint(context, pointToDraw.x, pointToDraw.y);
} else {
CGContextAddLineToPoint(context, pointToDraw.x, pointToDraw.y);
}
}
CGContextSetStrokeColorWithColor(context, [lineColor CGColor]);
CGContextStrokePath(context);
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultingImage;
}
我知道这可能不是最好的方法,所以如果你有更好或更快的方法:请分享:)
答案 1 :(得分:0)
我将plaetzchen的答案转换为MKMapSnapshot的快速4扩展
import MapKit
extension MKMapSnapshot {
func drawPolyline(_ polyline: MKPolyline, color: UIColor, lineWidth: CGFloat) -> UIImage {
UIGraphicsBeginImageContext(self.image.size)
let rectForImage = CGRect(x: 0, y: 0, width: self.image.size.width, height: self.image.size.height)
// Draw map
self.image.draw(in: rectForImage)
var pointsToDraw = [CGPoint]()
let points = polyline.points()
var i = 0
while (i < polyline.pointCount) {
let point = points[i]
let pointCoord = MKCoordinateForMapPoint(point)
let pointInSnapshot = self.point(for: pointCoord)
pointsToDraw.append(pointInSnapshot)
i += 1
}
let context = UIGraphicsGetCurrentContext()
context!.setLineWidth(lineWidth)
for point in pointsToDraw {
if (point == pointsToDraw.first) {
context!.move(to: point)
} else {
context!.addLine(to: point)
}
}
context?.setStrokeColor(color.cgColor)
context?.strokePath()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
你这样调用它:
let image = mapSnapshot.drawPolyline(polyline, color: uiColor, lineWidth: 4)