2013-06-13 3 views
5

J'ai une superposition de route à placer sur une carte. Je dois ajuster sa rotation afin qu'elle chevauche exactement avec la vue de la carte sous-jacente. Comment puis-je atteindre cet objectif? J'ai trouvé l'angle de rotation. Comment puis-je faire pivoter ma vue de superposition? Jusqu'à présent, j'ai ajouté la superposition, mais je ne peux pas faire de rotation en utilisant des transformations. Ce que j'ai remarqué, c'est que lorsque je change l'angle, l'image ne tourne pas, mais glisse le long de l'axe x (côtés).MKOverlayView à faire pivoter

Voici le code que j'ai essayé

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

Voici ce que je reçois

enter image description here

J'ai une solution dans laquelle je tourne manuellement l'image avec GIMP et placer. Mais j'ai besoin d'être personnalisé.

C'est le image transformé avec GIMP et lorsqu'il est placé sur la carte comme superposition

et c'est quand je tourne contexte à l'aide de transformer [note: tout en faisant tourner le contexte de l'image est mise en rotation mais pas à l'endroit exact Voir image. Aussi les pauses d'image sur le zoom]

Ce que j'ai fait

 //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

Comment est votre code d'initialisation ou quel est le point de vue "auto" auquel vous appliquez la transformation? Avez-vous essayé de faire tourner le contexte? – Lukas

+0

@Lukas: C'est la vue de superposition qui est référencée comme self. J'ai même essayé de faire tourner le contexte. Qu'est-ce qui s'est passé était que pendant le zoom dans l'image se brise. Y a-t-il un autre moyen d'y parvenir? J'ai l'impression qu'il y a un moyen de le faire, mais toutes les façons que j'ai essayées, je pouvais soit faire une rotation avec une image cassée sur le zoom ou l'emplacement exact. Pas les deux ensemble. – Meera

+0

@MeeraJPai pourriez-vous présenter une version dont l'image a été tournée de la façon dont vous voulez la faire pivoter? Je comprends que vous devrez peut-être utiliser votre solution de contournement pour obtenir ce que vous voulez dans ce cas-ci. –

Répondre

0

Essayez d'ajouter cette méthode:

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

Il est correct avec moi, s'il vous plaît essayer