如何在 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
来暂停动画。
对于叠加层,您可以创建一个包含OLImageView
和MyOverlayView
的MyGifContainerView
,应该很容易做到。
【讨论】:
【参考方案5】:你可以通过检查 UIScrollView 来获取 UIWebView 的 Size
webview.scrollView.frame
有点骇人听闻,但这通常对我在获取 webView 中内容的大小有用。
然后按照 Sha 的建议使用委托检查它是否已加载
- (void)webViewDidFinishLoad:(UIWebView *)webView
... Show Web View
【讨论】:
以上是关于如何在 iOS 上的某个帧中显示 GIF,直到完全加载后才显示,并允许缩放?的主要内容,如果未能解决你的问题,请参考以下文章
使用 OpenCV 和 Java 从 gif 帧中获取 Mats
如何计算动画 gif 循环的次数并在 javascript 中显示该计数?