Wyświetl animowany GIF w iOS

91

Zauważyłem, że dzięki iMessage można teraz wysyłać i wyświetlać animowane gify. Czy to oznacza, że ​​Apple obsługuje teraz wyświetlanie animowanych plików GIF w aplikacji, czy też najłatwiejszą metodą jest nadal dzielenie obrazu na klatki, a następnie ich sekwencyjne wyświetlanie? Jaki jest najłatwiejszy sposób wyświetlania animowanego GIF-a od iOS 5.1?

Dzięki!

swickblade
źródło

Odpowiedzi:

140

Jeśli celujesz w system iOS7 i masz już obraz podzielony na ramki, których możesz użyć animatedImageNamed:duration:.

Powiedzmy, że animujesz spinner. Skopiuj wszystkie ramki do projektu i nazwij je w następujący sposób:

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

Następnie utwórz obraz za pomocą:

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

Z dokumentów :

Ta metoda ładuje serię plików, dołączając serię liczb do podstawowej nazwy pliku podanej w parametrze name. Na przykład, jeśli parametr name zawierałby „obraz”, ta metoda próbowała załadować obrazy z plików o nazwach „image0”, „image1” itd. Aż do „image1024”. Wszystkie obrazy zawarte w animowanym obrazie powinny mieć ten sam rozmiar i skalę.

Joe Masilotti
źródło
5
A jeśli nie masz animacji w ramkach, możesz otworzyć GIF w aplikacji Podgląd i po prostu przeciągnąć klatki na zewnątrz. Ramki powinny być rozpakowane jako .tiff, więc zobacz tutaj: maclife.com/article/howtos/…
André Fratelli
38

Poleciłbym użycie następującego kodu, jest znacznie lżejszy i kompatybilny z projektem ARC i innym niż ARC, dodaje prostą kategorię na UIImageView:

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

Eric
źródło
1
Nie
radziłbym,
3
Zbyt duże użycie pamięci
Roman Truba
38

FLAnimatedImage to wydajny, animowany silnik GIF typu open source dla systemu iOS:

  • Odtwarza wiele plików GIF jednocześnie z prędkością odtwarzania porównywalną z przeglądarkami komputerowymi
  • Uwzględnia zmienne opóźnienia klatek
  • Zachowuje się wdzięcznie pod presją pamięci
  • Eliminuje opóźnienia lub blokady podczas pierwszej pętli odtwarzania
  • Interpretuje opóźnienia ramek w szybkich plikach GIF w taki sam sposób, jak robią to nowoczesne przeglądarki

To dobrze przetestowany komponent, który napisałem, aby zasilać wszystkie GIF-y w Flipboard .

Raphael Schaad
źródło
bieżąca właściwość ramki zwraca nieprawidłowy wynik z tego frameworka! github.com/Flipboard/FLAnimatedImage/issues/222
Mo Farhand
12

Inną alternatywą jest użycie a UIWebViewdo wyświetlenia animowanego GIF-a. Jeśli GIF ma zostać pobrany z serwera, zajmie się pobieraniem. Działa również z lokalnymi plikami GIF.

Thomas W.
źródło
Dzięki. To działa dobrze. Jednak przy pierwszym ładowaniu gifa do widoku internetowego może wystąpić pewne opóźnienie, co powoduje „zwolnione tempo” animacji. jeśli wymagasz płynniejszego animowania ramek udostępnionych w odpowiedzi na to pytanie, może być lepsze.
Hammer
2
„Począwszy od iOS 8.0 i OS X 10.10, użyj WKWebView, aby dodać zawartość internetową do swojej aplikacji. Nie używaj UIWebView ani WebView.” developer.apple.com/reference/webkit/wkwebview
Jason Moore
1
Używanie WebKit do wyświetlania GIF-a jest jak kupowanie statku towarowego do transportu artykułów spożywczych do domu. Widoki internetowe są bardzo drogie i wymagają zainicjowania pełnego JavaScript i silnika renderującego. Gorąco polecam skorzystanie z rozwiązania do przeglądania obrazów
Syreny
8

Od frameworka iOS 11 Photos umożliwia dodawanie odtwarzania animowanych Gifów.

Przykładową aplikację można pobrać tutaj

Więcej informacji o odtwarzaniu animowanych GIF-ów (od 13:35 min): https://developer.apple.com/videos/play/wwdc2017/505/

wprowadź opis obrazu tutaj

szarfa
źródło
hej @sash Przykładowa aplikacja nie ma klasy „AnimatedImage”. Czy jest inna struktura, którą importuję?
Shabarinath Pabba
@ShabarinathPabba Wygląda na to, że przykładowa aplikacja została zaktualizowana :(
sash
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
źródło
Niskie zużycie pamięci i łatwe w użyciu, ale bardzo wolno odtwarza gif
Roman Truba
2

Możesz użyć SwiftGif z tego linku

Stosowanie:

imageView.loadGif(name: "jeremy")
david72
źródło