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