如何在一个特定的框架上在iOS上显示GIF,直到满载才显示,并允许缩放?
当用户select一个GIF时,我想在所有显示GIF的顶部显示一个叠加层。
我知道在iOS上有几种方法可以做到这一点。 有很好的UIImage + animatedGIF ,它运行得很好,但是对于较长的GIF,它们非常慢,不能以与UIWebView相同的速度播放(以准确的播放速度播放)。
这很糟糕,因为如果这个类别没有慢慢播放它,它会做我需要的一切。
但它不,所以我尝试使用UIWebView,但是我有三件事情困惑:
-
如何获得UIWebView应呈现的大小(框架)? 我需要首先下载GIF作为UIImage,然后检查其
size
属性? 有没有更好的方法(可能需要一段时间)? -
如何在播放完之前阻止播放?
-
使用上面的类别,因为它只是一个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一个包含OLImageView
和MyOverlayView
,应该很容易。
你可以通过检查它的UIScrollView来获得UIWebView的大小
webview.scrollView.frame
一种哈克,但这通常在我得到的webView内容的大小的作品。
然后检查它已经通过使用委托加载沙build议
- (void)webViewDidFinishLoad:(UIWebView *)webView { ... Show Web View }