使用MKOverlayRenderer在MKMapView覆盖中不起作用的动画gif

时间:2013-12-13 03:29:57

标签: objective-c ios7 uiimageview mapkit mkoverlay

我正在尝试在MKMapView的叠加层中显示动画gif。使用MKOverlayRenderer创建叠加层。要在iOS 7中为gif制作动画,我在GitHub上使用UIImage+animatedGIF类别here。{/ p>

使用该类别,动画gif的图像在叠加层中显示正常;但是,gif没有动画。我使用该类别在UIImageView中为gif设置动画没有问题,但它似乎无法在地图视图叠加层中正常工作。

如何使用此类别将动画gif放置在地图视图叠加层中?

...或

有没有办法在叠加层中放置UIImageView,可以通过设置带动画gif的UIImageView来解决我的问题?

我的叠加渲染器子类如下:

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

在我的UIViewController中,我正在通过调用包含以下代码的方法来获取动画gif并添加叠加层:

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

有关如何在iOS 7地图视图叠加层中为gif设置动画的任何建议都将非常感激。

2 个答案:

答案 0 :(得分:3)

https://github.com/jhurray/iOS7AnimatedMapOverlay

这是在iOS7中为叠加层制作动画的最佳方式

答案 1 :(得分:1)

因为地图视图叠加层正在CGContext中进行绘制,所以它不会设置动画 - 这是一个被绘制并转换为视图内容的缓冲区,而不是正常的部分。查看层次结构很遗憾,您需要反复使用-setNeedsDisplayInMapRect:zoomScale:来请求动画。这个系统比iOS 6和之前的系统灵活一点,它在地图上添加了普通视图。