如何在 iOS 上的某个帧中显示 GIF,直到完全加载后才显示,并允许缩放?

Posted

技术标签:

【中文标题】如何在 iOS 上的某个帧中显示 GIF,直到完全加载后才显示,并允许缩放?【英文标题】:How to show a GIF on iOS in a certain frame, not show it until fully loaded, and allow zoom? 【发布时间】:2013-12-30 01:25:55 【问题描述】:

当用户选择 GIF 时,我想在所有显示 GIF 的内容上显示一个叠加层。

我知道 ios 上有几种方法可以做到这一点。很棒的 UIImage+animatedGIF 运行良好,但对于较长的 GIF,它们非常慢,并且播放速度与 UIWebView 不同(以准确的播放速度播放)。

这很糟糕,因为如果那个类别不慢慢播放它们,它会做我需要的一切。

但它没有,所以我尝试使用 UIWebView,但是我对三件事感到困惑:

    如何获得 UIWebView 在呈现时应具有的大小(其框架)?我是否必须先将 GIF 作为 UIImage 下载,然后检查其 size 属性?有没有更好的方法(可能需要一段时间)?

    如何在完全加载之前停止播放?

    使用上面的类别,因为它只是一个 UIImage,当我将它作为 UIImageView 嵌入到滚动视图中时,它很容易放大和缩小。这可以通过 UIWebview 实现吗?

【问题讨论】:

【参考方案1】:

1.

想到的第一个解决方案是将 webview 的背景设置为清除颜色,并在加载完成后将其放置在正确的位置。 通常我使用

[webView stringByEvaluatingjavascriptFromString:@"document.body.offsetHeight;"]

但是如果你将你的 webview 指向一个 gif url,那将不起作用。

2.

- (void)webViewDidFinishLoad:(UIWebView *)webView

    webView.alpha = 1;

这样,只有在 gif 完全加载后,UIWebView 才会显示给用户。

3.

[webView setScalesPageToFit:YES];

【讨论】:

+1 对于 #1,创建一个简单的网页并将网页视图指向该网页,而不是普通的 .gif。【参考方案2】:

您可以使用支持动画 GIF 的 SDWebImage

https://github.com/rs/SDWebImage/blob/master/SDWebImage/UIImage%2BGIF.m

        _block BOOL flag = NO;
        NSURL *imageURL = [NSURL URLWithString:@"ImageUrl" relativeToURL:@"mainURL"] ;
        SDWebImageManager *manager = [SDWebImageManager sharedManager];
        [manager downloadWithURL:imageURL
                         options:0
                        progress:^(NSUInteger receivedSize, long long expectedSize)
         
         
                       completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
         
             if (image)
                 flag = YES;
                 downloadProgress++;
             
         ];

【讨论】:

示例项目甚至无法打开。【参考方案3】:

如果您尝试显示的叠加层类似于暗色背景,其中图像设置在中间,并根据您尝试获得的加载类型来判断。我会使用带有图像视图、Web 视图和活动指示器的 UIView 或其他东西来显示加载。

用户按下 gif,您显示 UIView 和 UIImage 视图,背景颜色为黑色(例如)和一定的 alpha(0.7),这将是暗淡的背景,您还应该显示活动指示器正在运行,并确保网络视图是隐藏的。

一旦 web 视图完成加载并使用 "webViewDidFinishLoad:" 委托方法,您可以获取其大小并在视图内进行相应调整,然后将 webview hidden 属性设置为 NO(并且不要忘记隐藏活动指示器)。

UIWebView 中的 "@property(nonatomic) BOOL scalesPageToFit" 控制用户是否能够缩放:

如果是,网页会缩放以适应用户可以放大和缩放 出去。如果否,则禁用用户缩放。默认值为 NO。

此外,您可能希望显示带有 gif 预览的第二个 UIImage 视图(用于向用户显示选择 gif 的视图将起作用)然后只需隐藏图像视图并在 gif 时显示 webview已准备好显示。

【讨论】:

【参考方案4】:

我建议使用OLImageView。 播放准确。

它还支持增量加载,因此您可以尽快了解帧。

+ (instancetype)imageWithIncrementalData:(NSData *)data;

您也可以通过调用 stopAnimating 来暂停动画。

对于叠加层,您可以创建一个包含OLImageViewMyOverlayViewMyGifContainerView,应该很容易做到。

【讨论】:

【参考方案5】:

你可以通过检查 UIScrollView 来获取 UIWebView 的 Size

webview.scrollView.frame

有点骇人听闻,但这通常对我在获取 webView 中内容的大小有用。

然后按照 Sha 的建议使用委托检查它是否已加载

- (void)webViewDidFinishLoad:(UIWebView *)webView

... Show Web View

【讨论】:

以上是关于如何在 iOS 上的某个帧中显示 GIF,直到完全加载后才显示,并允许缩放?的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 和 Java 从 gif 帧中获取 Mats

如何计算动画 gif 循环的次数并在 javascript 中显示该计数?

GIF 图像不显示在 iPhone 上

ImageView 中较长的 gif 持续时间

iOS启动图-从网络获取的gif图,在本地一直是没有动画,还模糊的

如何仅捕获屏幕上的鼠标单击区域?