Zeigen Sie animiertes GIF in iOS an

90

Mir ist aufgefallen, dass mit iMessage jetzt animierte Gifs gesendet und angezeigt werden können. Bedeutet dies, dass Apple jetzt die Anzeige animierter GIFs in einer Anwendung unterstützt, oder ist es immer noch die einfachste Methode, das Bild in Frames aufzuteilen und diese dann nacheinander anzuzeigen? Was ist der einfachste Weg, um ein animiertes GIF ab iOS 5.1 anzuzeigen?

Vielen Dank!

Swickblade
quelle

Antworten:

140

Wenn Sie auf iOS7 abzielen und das Bild bereits in Frames aufgeteilt haben, können Sie es verwenden animatedImageNamed:duration:.

Angenommen, Sie animieren einen Spinner. Kopieren Sie alle Ihre Frames in das Projekt und benennen Sie sie wie folgt:

  • spinner-1.png
  • spinner-2.png
  • spinner-3.png
  • usw. ,

Dann erstellen Sie das Bild über:

[UIImage animatedImageNamed:@"spinner-" duration:1.0f];

Aus den Dokumenten :

Diese Methode lädt eine Reihe von Dateien, indem eine Reihe von Zahlen an den im Parameter name angegebenen Basisdateinamen angehängt wird. Wenn der Parameter name beispielsweise "image" als Inhalt enthält, versucht diese Methode, Bilder aus Dateien mit den Namen "image0", "image1" usw. bis zu "image1024" zu laden. Alle im animierten Bild enthaltenen Bilder sollten dieselbe Größe und denselben Maßstab haben.

Joe Masilotti
quelle
5
Und wenn Sie die Animation nicht in Frames haben, können Sie ein GIF in der Vorschau-App öffnen und die Frames einfach herausziehen. Die Frames sollten als .tiff extrahiert werden, also siehe hier: maclife.com/article/howtos/…
André Fratelli
38

Ich würde empfehlen, den folgenden Code zu verwenden. Er ist viel leichter und mit ARC- und Nicht-ARC-Projekten kompatibel. Er fügt UIImageView eine einfache Kategorie hinzu:

https://github.com/mayoff/uiimage-from-animated-gif/

Eric
quelle
1
Würde es nicht
empfehlen,
3
Zu hohe Speichernutzung
Roman Truba
38

FLAnimatedImage ist eine performante animierte Open Source-GIF-Engine für iOS:

  • Spielt mehrere GIFs gleichzeitig mit einer Wiedergabegeschwindigkeit ab, die mit Desktop-Browsern vergleichbar ist
  • Berücksichtigt variable Frame-Verzögerungen
  • Benimmt sich anmutig unter Gedächtnisdruck
  • Beseitigt Verzögerungen oder Blockierungen während der ersten Wiedergabeschleife
  • Interpretiert die Frame-Verzögerungen schneller GIFs genauso wie moderne Browser

Es ist eine gut getestete Komponente, die ich geschrieben habe, um alle GIFs in Flipboard mit Strom zu versorgen .

Raphael Schaad
quelle
Die aktuelle Frame-Eigenschaft gibt für dieses Framework falsch zurück! github.com/Flipboard/FLAnimatedImage/issues/222
Mo Farhand
12

Eine andere Alternative ist die Verwendung von a UIWebView, um das animierte GIF anzuzeigen. Wenn das GIF von einem Server abgerufen werden soll, wird das Abrufen erledigt. Es funktioniert auch mit lokalen GIFs.

ThomasW
quelle
Vielen Dank. Das funktioniert gut. Beim ersten Laden von GIF in die Webansicht kann es jedoch zu Verzögerungen kommen, die die Zeitlupe der Animation verursachen. Wenn Sie möchten, dass es flüssiger ist, ist es möglicherweise besser, Frames zu animieren, die in der Antwort auf diese Frage geteilt werden.
Hammer
2
"Verwenden Sie ab iOS 8.0 und OS X 10.10 WKWebView, um Ihrer App Webinhalte hinzuzufügen. Verwenden Sie nicht UIWebView oder WebView." developer.apple.com/reference/webkit/wkwebview
Jason Moore
1
Die Verwendung von WebKit zur Anzeige eines GIF ist wie der Kauf eines Frachtschiffs, um Ihre Lebensmittel zu Ihrem Haus zu transportieren. Webansichten sind sehr, sehr teuer und erfordern die Initialisierung einer vollständigen JavaScript- und Rendering-Engine. Ich würde wärmstens empfehlen, eine Bildansichtslösung zu verwenden
Sirenen
8

Ab iOS 11 ermöglicht das Fotos-Framework das Hinzufügen einer animierten Gifs-Wiedergabe.

Beispiel-App kann hier heruntergeladen werden

Weitere Informationen zur animierten Gifs-Wiedergabe (ab 13:35 Minuten): https://developer.apple.com/videos/play/wwdc2017/505/

Geben Sie hier die Bildbeschreibung ein

Schärpe
quelle
hey @sash Die Beispiel-App hat keine "AnimatedImage" -Klasse. Gibt es ein anderes Framework, das ich importiere?
Shabarinath Pabba
@ShabarinathPabba es sieht so aus, als ob die Beispiel-App aktualisiert wurde :(
Schärpe
7
#import <QuickLook/QuickLook.h>
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    QLPreviewController *preview = [[QLPreviewController alloc] init];
    preview.dataSource = self;

    [self addChildViewController:preview];
    [self.view addSubview:preview.view];
}

#pragma mark - QLPreviewControllerDataSource

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)previewController
{
    return 1;
}

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{
    NSURL *fileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"myanimated.gif" ofType:nil]];
    return fileURL;
}

@end
Erik Holley
quelle
Geringe Speichernutzung und einfach zu bedienen, spielt aber
GIF