【问题标题】:Animated gif not working in MKMapView overlay using MKOverlayRenderer动画 gif 在使用 MKOverlayRenderer 的 MKMapView 叠加层中不起作用
【发布时间】:2013-12-31 18:07:02
【问题描述】:

我正在尝试在 MKMapView 的叠加层中显示动画 gif。覆盖是使用MKOverlayRenderer 创建的。为了在 iOS 7 中制作 gif 动画,我使用了在 GitHub 上发布的 UIImage+animatedGIF 类别 here

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

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

或者...

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

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

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 动画的建议将不胜感激。

【问题讨论】:

  • 我已经为在 MapView 上渲染天气信息做了类似的事情你只想要这样吗?如果是,那么让我知道我会详细解释你。
  • @iosRider 是的,请详细解释或作为答案提交。

标签: objective-c ios7 uiimageview mapkit mkoverlay


【解决方案1】:

https://github.com/jhurray/iOS7AnimatedMapOverlay

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

【讨论】:

  • 不鼓励仅链接的答案,你能总结一下吗?
  • 这是否允许在叠加层中显示动画 gif 和动画?
  • 很抱歉。要在 iOS7 中正确地为地图制作动画,您需要做的是向您的 MKMapView 添加动画视图。您不能再将子视图添加到叠加层。这也意味着每次 mapViewRegionWill/DidChange 都必须删除并将其添加到适当的位置。相应的计算在上面链接的 github 项目中。
【解决方案2】:

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

【讨论】:

  • 那么如何使用setNeedsDisplayInMapRect 制作动画gif?
  • 如果这样的话……我想你应该设置一个计时器并在每个间隔调用'setNeedsDisplayInMapRect'?并确保每次都在您的“drawMapRect”中绘制一张新图片。
  • @wdanxna 那么你是说使用计时器来显示 gif 的每一帧?您能否提交一个更详细解释这一点的答案?
  • 是的,这可能会很糟糕,因为您需要计算当前的 MKMapRect 以覆盖图像的可见部分,但是当您使用 setNeedsDisplayInMapRect: 请求刷新时,它的一部分可能会在不同的时间加载。取决于你的渲染程序有多快。
  • @incanus 我认为将UIImageView 放入叠加层可能会更好(如果可能的话)。这样我就知道UIImage+animatedGIF 类别应该可以工作,因为它是为UIImageView 制作的。但是,我目前不知道如何以编程方式将 UIImageView 放入覆盖渲染器中。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-13
  • 2017-06-15
  • 2012-04-11
  • 1970-01-01
  • 2013-08-28
相关资源
最近更新 更多