2013-06-13 8 views
5

Ich habe eine Overlay der Route über eine Karte platziert werden. Ich muss seine Drehung so anpassen, dass sie genau mit der darunter liegenden Kartenansicht überlappt. Wie kann ich das erreichen? Ich habe den Winkel zum Drehen gefunden. Wie kann ich meine Overlay-Ansicht drehen? Bis jetzt habe ich das Overlay hinzugefügt, kann aber nicht mit Transformationen rotieren. Was ich bemerkte, ist, dass wenn ich den Winkel ändere, das Bild nicht rotiert, sondern es entlang der x-Achse (Seitenwege) gleitet. HierMKOverlayView gedreht werden

ist der Code, den ich versuchte

- (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); 
} 

Dies ist, was ich

enter image description here

erhalten Ich habe eine Abhilfe, in dem ich manuell das Bild mit GIMP und legen Sie es drehen. Aber ich muss es angepasst werden.

Dies ist die image GIMP transformiert verwenden und wenn auf der Karte als Overlay

platziert und das ist, wenn ich Context drehen Transformation mit [Anmerkung: während des Drehens den Kontext das Bild gedreht wird, ist aber genau an der Stelle nicht sehen image. Auch die Bildunterbrechungen auf Zoomen]

Das ist, was ich tat

 //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); 
+0

Wie ist Ihr Initialisierungscode oder was ist die Ansicht "selbst", auf die Sie die Transformation anwenden? Haben Sie versucht, den Kontext zu drehen? – Lukas

+0

@Lukas: Es ist die Overlay-Ansicht, die als selbst referenziert wird. Ich habe sogar versucht, den Kontext zu drehen. Was passiert ist, ist, dass beim Zoomen das Bild bricht. Gibt es einen anderen Weg, dies zu erreichen? Ich habe das Gefühl, dass es einen Weg zu tun gibt, aber bei all den Möglichkeiten, die ich versucht habe, könnte ich entweder eine Drehung mit Bildunterbrechung beim Zoomen oder den genauen Standort erreichen. Nicht beides zusammen. – Meera

+0

@MeeraJPai können Sie eine Version präsentieren, in der das Bild so gedreht ist, wie Sie es gedreht haben möchten? Ich verstehe, dass Sie Ihre Problemumgehung möglicherweise verwenden müssen, um zu erhalten, was Sie in dieser einen Instanz wünschen. –

Antwort

0

Versuchen Sie diese Methode hinzufügen:

- (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; 

} 
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); 

Es ist richtig, mit mir, bitte versuchen Sie es

Verwandte Themen