如何在一个特定的框架上在iOS上显示GIF,直到满载才显示,并允许缩放?

当用户select一个GIF时,我想在所有显示GIF的顶部显示一个叠加层。

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

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

但它不,所以我尝试使用UIWebView,但是我有三件事情困惑:

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

  2. 如何在播放完之前阻止播放?

  3. 使用上面的类别,因为它只是一个UIImage,当我把它作为一个UIImageViewembedded到一个滚动视图中时,它很容易放大和缩小。 这是可能的与UIWebview?

1。

首先想到的解决scheme是设置webview的背景以清除颜色,并在完成加载后将其放置在正确的位置。 通常我使用

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

但是如果你正在将你的webview导向到一个gif url,这将不起作用。

2。

 - (void)webViewDidFinishLoad:(UIWebView *)webView { webView.alpha = 1; } 

这样的UIWebView将被显示给用户只有gif完全加载后。

3。

 [webView setScalesPageToFit:YES]; 

您可以使用SDWebImage它具有animationGIF支持

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

如果你想要显示的覆盖层是一个灰色的背景,在图像设置在中间的位置,并根据你正试图获得的加载types来判断。 我会使用一个UIView与图像视图,networking视图和活动指标或东西来显示加载。

用户按下gif,用UIImage视图显示UIView,背景颜色为黑色(例如),以及一个特定的阿尔法(0.7),这将是变暗的背景,您还应该显示活动指示器运行,并确保网页视图是隐藏的。

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

UIWebView中的“@property(nonatomic)BOOL scalesPageToFit”控制着用户可以缩放:

如果是,网页将缩放以适合用户放大和缩小。 如果否,则禁用用户缩放。 默认值是NO。

此外,你可能想要显示第二个UIImage视图的预览的GIF(你正在使用的显示用户select的GIF将工作)然后只隐藏图像视图,并显示Web视图,当GIF准备好被显示。

我会build议使用OLImageView 。 它有准确的播放。

它也支持增量加载,所以你会尽可能快地知道框架。

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

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

对于叠加,您可以创build一个包含OLImageViewMyOverlayView ,应该很容易。

你可以通过检查它的UIScrollView来获得UIWebView的大小

 webview.scrollView.frame 

一种哈克,但这通常在我得到的webView内容的大小的作品。

然后检查它已经通过使用委托加载沙build议

 - (void)webViewDidFinishLoad:(UIWebView *)webView { ... Show Web View }