2013-12-11 8 views
5

Wenn ein Benutzer ein GIF auswählt, möchte ich ein Overlay über alles anzeigen, das das GIF zeigt.Wie zeige ich ein GIF auf iOS in einem bestimmten Frame, zeige es erst, wenn es vollständig geladen ist, und erlaube Zoom?

Ich weiß, dass es auf iOS einige Möglichkeiten gibt, dies zu tun. Es gibt die großartige UIImage+animatedGIF, die anständig funktioniert, aber für längere GIFs sind sie sehr langsam und spielen nicht mit der gleichen Geschwindigkeit ab wie ein UIWebView (der mit der genauen Wiedergabegeschwindigkeit spielt).

Es ist scheiße, denn wenn diese Kategorie sie nicht langsam wiedergeben würde, würde es alles tun, was ich brauche.

Aber es funktioniert nicht, so habe ich versucht, mit UIWebView, aber ich bin verwirrt über drei Dinge:

  1. Wie erhalte ich eine Größe, dass die UIWebView sein sollte, wenn präsentiert (dessen Rahmen)? Müsste ich das GIF zuerst als UIImage herunterladen und dann seine size Eigenschaft überprüfen? Gibt es einen besseren Weg (könnte eine Weile dauern)?

  2. Wie kann ich aufhören zu spielen, bis es voll geladen ist?

  3. Mit der oben genannten Kategorie, wie es nur ein UIImage ist, wenn ich es als UIImageView in eine Scrollview einbetten, ist es sehr einfach zu vergrößern und zu verkleinern. Ist das mit einem UIWebview möglich?

Antwort

2

1.

Die erste Lösung, die den Sinn kommt, ist der Hintergrund der Webansicht zu setzen Farbe zu löschen und es an der richtigen Stelle zu platzieren, nachdem sie geladen beendet. Normalerweise verwende ich

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

aber das wird nicht funktionieren, wenn Sie Ihre Webansicht auf eine gif url richten.

2.

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

diese Weise die UIWebView wird nur dem Benutzer angezeigt werden, nachdem der gif geladen ist voll.

3.

[webView setScalesPageToFit:YES]; 
+1

+1 Für # 1, eine einfache Web-Seite erstellen und die Web-Ansicht zu, dass anstelle der Ebene .gif verweisen. – Caleb

1

Wenn das Overlay Sie so etwas wie einem verdunkelten Hintergrund zu zeigen versuchen, ist in dem das Bild auf der Mitte und die Beurteilung durch die Art der Belastung eingestellt wird, um Sie versuchen. Ich würde eine UIView mit einer Bildansicht, einer Webansicht und einem Aktivitätsindikator oder etwas verwenden, um das Laden anzuzeigen.

Der Benutzer drückt das GIF, Sie zeigen die UIView mit der Hintergrundfarbe Schwarz (zum Beispiel) und mit einem bestimmten Alpha (0,7), der den abgeblendeten Hintergrund darstellt, sollten Sie auch den Aktivitätsindikator anzeigen lassen und vergewissern Sie sich, dass die Webansicht ausgeblendet ist.

Sobald der Web-Ansicht fertig geladen und mit dem „webViewDidFinishLoad:“ Delegatmethode, können Sie seine Größe erhalten und passen es entsprechend in der Ansicht, legen Sie dann die Webansicht versteckt Eigenschaft auf NO (und vergessen Sie nicht, sich zu verstecken der Aktivitätsindikator auch).

Die "@property (nonatomic) BOOL scalesPageToFit" von der UIWebView steuert den Benutzer vergrößern zu können:

Wenn JA, wird die Webseite kann die Größe skaliert, und der Benutzer die Ansicht vergrößern und Zoom aus. Wenn NEIN, ist das Zoomen des Benutzers deaktiviert. Der Standardwert ist NEIN.

Zusätzlich sollten Sie mit der Vorschau des gif eine zweite UIImage Ansicht zeigen (die, die Sie dem Benutzer zeigen, werden mit dem gif wählen funktioniert) Dann verstecken Sie einfach die Bildansicht und zeigen die Webansicht wenn das Gif zur Anzeige bereit ist.

1

Ich würde vorschlagen, zu verwenden. Es hat eine genaue Wiedergabe.

Es unterstützt auch inkrementelles Laden, so dass Sie den Rahmen so schnell wie möglich kennen.

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

Auch können Sie die Animation Pause nur durch stopAnimating aufrufen.

Für das Overlay können Sie eine MyGifContainerView erstellen, die sowohl OLImageView als auch MyOverlayView enthält, sollte einfach zu tun sein.

2

können Sie SDWebImage verwenden es hat Animierte GIF-Unterstützung

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

Das Beispielprojekt wird nicht einmal geöffnet. –

1

Sie die Größe eines UIWebView UIScrollView es bekommen kann

indem Sie
webview.scrollView.frame 

Art hacky aber dies in der Regel funktioniert für mich, um die Größe des Inhalts innerhalb des WebView zu erhalten.

Dann überprüft es ist geladen von den Delegierten mit als Sha

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