2013-12-13 18 views
8

Sto tentando di visualizzare una gif animata in una sovrapposizione per MKMapView. La sovrapposizione viene creata utilizzando MKOverlayRenderer. Per animare la gif in iOS 7, sto utilizzando la categoria UIImage+animatedGIF pubblicata here su GitHub.Gif animato che non funziona nella sovrapposizione di MKMapView utilizzando MKOverlayRenderer

L'immagine della gif animata viene visualizzata correttamente nella sovrapposizione utilizzando la categoria; tuttavia, la gif non si anima. Non ho problemi ad usare la categoria per animare una gif in un UIImageView ma non sembra funzionare correttamente in una sovrapposizione di visualizzazione mappa.

Come posso utilizzare questa categoria per posizionare una gif animata in una sovrapposizione di visualizzazione mappa?

o ...

C'è un modo per inserire un UIImageView nella sovrapposizione che potrebbe risolvere il mio problema impostando il UIImageView con la gif animata?

mio sovrapposizione renderer sottoclasse è la seguente:

MapOverlayRenderer.h

#import <MapKit/MapKit.h> 

@interface MapOverlayRenderer : MKOverlayRenderer 
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage; 
@end 

MapOverlayRenderer.m

#import "MapOverlayRenderer.h" 

@interface MapOverlayRenderer() 
@property (strong,nonatomic) UIImage *image; 
@end 

@implementation MapOverlayRenderer 

- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage { 

    self = [super initWithOverlay:overlay]; 

    if (self) { 
     _image = overlayImage; 
    } 

    return self; 
} 

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { 

    CGImageRef imageReference = self.image.CGImage; 

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

    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextTranslateCTM(context, 0.0, -theRect.size.height); 

    CGContextDrawImage(context, theRect, imageReference);  
} 

@end 

Nel mio UIViewController, io sono il recupero della gif animata e aggiungendo la sovrapposizione chiamando un metodo che contiene il seguente codice:

NSURLSession *session = [NSURLSession sharedSession]; 

    [[session dataTaskWithURL:[NSURL URLWithString:radarUrl] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     self.radarImage = [UIImage animatedImageWithAnimatedGIFData:data]; //for animated radar image 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      [self.mapView addOverlay:self.polygon]; 

     }); 

    }] resume]; 

Qualsiasi suggerimento su come animare una gif in una sovrapposizione di viste della mappa di iOS 7 sarebbe molto apprezzato.

+1

ho fatto qualcosa di simile per il rendering informazioni meteo sul MapView Vuoi così solo? Se sì allora fammi sapere vi spiegherò tu in dettaglio. –

+0

@iosRider Sì, si prega di spiegare più in dettaglio o inviare come risposta. – wigging

risposta

1

Poiché la sovrapposizione di una vista mappa sta avendo il tuo disegno in un CGContext, non verrà animato - si tratta di un buffer che viene disegnato e tradotto per visualizzare i contenuti, anziché essere una normale parte della gerarchia della vista. Sfortunatamente è necessario utilizzare ripetutamente lo -setNeedsDisplayInMapRect:zoomScale: per richiedere animazioni. Questo sistema è un po 'meno flessibile di iOS 6 e precedenti, che ha aggiunto viste normali in cima alla mappa.

+0

Quindi, come si usa 'setNeedsDisplayInMapRect' per la gif animata? – wigging

+1

Se in questo modo ... penso che probabilmente dovresti impostare un timer e chiamare "setNeedsDisplayInMapRect" ogni intervallo? e assicurati che ogni volta venga disegnata una nuova immagine nel tuo 'drawMapRect'. – wdanxna

+1

@wdanxna Quindi stai dicendo di usare il timer per visualizzare ogni fotogramma della gif? Potresti inviare una risposta spiegando questo in maggiore dettaglio? – wigging

3

https://github.com/jhurray/iOS7AnimatedMapOverlay

questo è il modo migliore per animare le sovrapposizioni in iOS7

+0

Link solo le risposte sono scoraggiate, puoi aspettare? –

+0

Ciò consente di visualizzare e animare le gif animate nella sovrapposizione? – wigging

+1

Mi dispiace per quello. Quello che devi fare per animare correttamente su una mappa in iOS7 è aggiungere una vista di animazione al tuo MKMapView. Non è più possibile aggiungere sottoview alle sovrapposizioni. Ciò significa anche che ogni volta che mapViewRegionWill/DidChange è necessario rimuovere e aggiungerlo allo spot appropriato. I calcoli appropriati si trovano nel progetto github collegato sopra. – jhurray