Objective c 使用mkoverlayrender的动画gif在MKMapView覆盖中不起作用

Objective c 使用mkoverlayrender的动画gif在MKMapView覆盖中不起作用,objective-c,ios7,uiimageview,mapkit,mkoverlay,Objective C,Ios7,Uiimageview,Mapkit,Mkoverlay,我试图在MKMapView的覆盖图中显示动画gif。覆盖是使用mkoverlayrender创建的。要在iOS 7中设置gif动画,我使用GitHub上发布的UIImage+animatedGIF类别 动画gif的图像在使用类别的覆盖中显示良好;但是,gif不会设置动画。我可以在UIImageView中使用该类别设置gif动画,但在地图视图覆盖中它似乎无法正常工作 如何使用此类别在地图视图覆盖中放置动画gif 或者 有没有一种方法可以将UIImageView放置在叠加中,通过设置带有动画gif的

我试图在
MKMapView
的覆盖图中显示动画gif。覆盖是使用
mkoverlayrender
创建的。要在iOS 7中设置gif动画,我使用GitHub上发布的
UIImage+animatedGIF
类别

动画gif的图像在使用类别的覆盖中显示良好;但是,gif不会设置动画。我可以在
UIImageView
中使用该类别设置gif动画,但在地图视图覆盖中它似乎无法正常工作

如何使用此类别在地图视图覆盖中放置动画gif

或者

有没有一种方法可以将
UIImageView
放置在叠加中,通过设置带有动画gif的
UIImageView
来解决我的问题

我的覆盖渲染器子类如下所示:

MapOverlayrender.h

#import <MapKit/MapKit.h>

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

任何关于如何在iOS 7地图视图覆盖中设置gif动画的建议都将不胜感激。

因为地图视图覆盖在
CGContext
中进行绘制,所以它不会设置动画,这是一个绘制并转换为视图内容的缓冲区,而不是视图层次结构的正常部分。不幸的是,您需要反复使用
-setneedsdisplayimprect:zoomScale:
来请求动画。该系统比iOS 6及之前的系统灵活性稍差,iOS 6及之前的系统在地图顶部添加了普通视图


这是在iOS7中设置覆盖动画的最佳方法

那么如何使用
setneedsdisplayimprect
制作动画gif?如果是这样的话……我想你应该设置一个计时器,并在每个间隔调用“setneedsdisplayimprect”?并确保每次都在“drawMapRect”中绘制了一张新图片。@wdanxna那么你是说使用计时器来显示gif的每一帧?您能否提交一个更详细的答案来解释这一点?是的,这可能会变得很糟糕,因为您需要计算当前的
mkmapret
来覆盖图像的可见部分,但是当您要求使用
setneedsDisplayinPrect:
刷新时,部分图像可能会在不同的时间加载。取决于渲染例程的速度。@incaus我认为最好将
UIImageView
放在叠加中(如果可能的话)。这样我知道
UIImage+animatedGIF
类别应该可以工作,因为它是为
UIImageView
制作的。但是,我目前不知道如何以编程方式将UIImageView放置到覆盖渲染器中。建议?我已经做了类似的事情,用于在MapView上渲染天气信息。您只想这样吗?如果是,请让我知道我将详细解释您。@iosRider是的,请详细解释或作为答案提交。不鼓励仅链接的答案,你能总结一下吗?这允许动画GIF在叠加中显示和动画吗?很抱歉。在iOS7中,要在地图上正确设置动画,您需要做的是将动画视图添加到MKMapView中。您不能再将子视图添加到覆盖。这也意味着每次MapViewRegion将/Did更改时,您都必须将其删除并添加到相应的位置。适当的计算在上面链接的github项目中。
#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
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];