要旋转的MKOverlayView

时间:2013-06-13 05:38:32

标签: ios mapkit mkoverlay

我有一个叠加的路线放在地图上。我必须调整它的旋转,使其与底层地图视图完全重叠。我怎样才能做到这一点?我找到了旋转的角度。如何旋转叠加视图?到目前为止,我已经添加了叠加层,但无法使用变换进行旋转。我注意到的是,当我改变角度时,图像不会旋转,而是沿x轴(侧面)滑动。

以下是我尝试的代码

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
{
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"routeImage" ofType:@"png"];
    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];

    MKMapRect theMapRect = self.overlay.boundingMapRect;
    CGRect theRect = [self rectForMapRect:theMapRect];

    CGAffineTransform transform = CGAffineTransformMakeRotation((-35.88) / 180.0 * M_PI);
    [self setTransform:transform];

    CGContextSaveGState(context);

    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextTranslateCTM(context, 0.0, -theRect.size.height);
    CGContextDrawImage(context, theRect,image.CGImage);
    CGContextRestoreGState(context);
}

这就是我得到的

enter image description here

我有一个解决方法,我使用GIMP手动旋转图像并放置它。但是我需要它来定制。

这是使用GIMP转换的image以及作为叠加层放置在地图上

这是我使用变换旋转上下文时[注意:旋转上下文时图像旋转但不在确切位置请参阅image。此外,图像在缩放时中断了

这就是我做的事情

      //Hayl-Road-Final.png is the actual image without transformation using GIMP

        UIImage *image   = [[UIImage imageNamed:@"Hayl-Road-Final.png"] retain];
        CGImageRef imageReference = image.CGImage;


        MKMapRect theMapRect    = [self.overlay boundingMapRect];
        CGRect theRect           = [self rectForMapRect:theMapRect];


        // We need to flip and reposition the image here
        CGContextScaleCTM(ctx, 1.0, -1.0);
        CGContextTranslateCTM(ctx, 0.0, -theRect.size.height);

        CGContextRotateCTM(ctx,-35.88);
        //drawing the image to the context
        CGContextDrawImage(ctx, theRect, imageReference);

2 个答案:

答案 0 :(得分:0)

尝试添加此方法:

- (UIImage *) rotate: (UIImage *) image angle:(double)
{
    //double angle = 20;
    CGSize s = {image.size.width, image.size.height};
    UIGraphicsBeginImageContext(s);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, 0,image.size.height);
    CGContextScaleCTM(ctx, 1.0, -1.0);

    CGContextRotateCTM(ctx, 2*M_PI*angle/360);
    CGContextDrawImage(ctx,CGRectMake(0,0,image.size.width, image.size.height),image.CGImage);
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;

}

答案 1 :(得分:0)

From your code, you change order of two line. It will be ok:

CGContextScaleCTM(ctx, 1.0, -1.0);
CGContextRotateCTM(ctx,-35.88);
CGContextTranslateCTM(ctx, 0.0, -theRect.size.height);
CGContextDrawImage(ctx, theRect, imageReference);

对我来说是对的,请尝试