Afficher un GIF animé sous iOS

90

J'ai remarqué qu'avec iMessage, les gifs animés peuvent désormais être envoyés et affichés. Cela signifie-t-il qu'Apple prend désormais en charge l'affichage de GIF animés dans une application, ou la méthode la plus simple consiste-t-elle toujours à diviser l'image en cadres, puis à les afficher de manière séquentielle? Quelle est la manière la plus simple d'afficher un GIF animé à partir d'iOS 5.1?

Merci!

Swickblade
la source

Réponses:

140

Si vous ciblez iOS7 et que l'image est déjà divisée en cadres, vous pouvez utiliser animatedImageNamed:duration: .

Disons que vous animez un spinner. Copiez tous vos cadres dans le projet et nommez-les comme suit:

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

Créez ensuite l'image via:

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

À partir de la documentation :

Cette méthode charge une série de fichiers en ajoutant une série de nombres au nom de fichier de base fourni dans le paramètre name. Par exemple, si le paramètre de nom avait 'image' comme contenu, cette méthode tenterait de charger des images à partir de fichiers avec les noms 'image0', 'image1' et ainsi de suite jusqu'à 'image1024'. Toutes les images incluses dans l'image animée doivent partager la même taille et l'échelle.

Joe Masilotti
la source
5
Et si vous n'avez pas l'animation dans les images, vous pouvez ouvrir un GIF dans l'application Aperçu et simplement faire glisser les images. Les images doivent être extraites au format .tiff, alors voir ici: maclife.com/article/howtos/…
André Fratelli
38

Je recommanderais d'utiliser le code suivant, il est beaucoup plus léger et compatible avec les projets ARC et non-ARC, il ajoute une catégorie simple sur UIImageView:

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

Eric
la source
1
Je ne le conseillerais pas si vous devez afficher plusieurs gifs, fonctionne très lentement
iago849
3
Utilisation de la mémoire trop élevée
Roman Truba
38

FLAnimatedImage est un moteur GIF animé open source performant pour iOS:

  • Lit plusieurs GIF simultanément avec une vitesse de lecture comparable à celle des navigateurs de bureau
  • Honore les délais de trame variables
  • Se comporte gracieusement sous la pression de la mémoire
  • Élimine les retards ou les blocages lors de la première boucle de lecture
  • Interprète les délais d'image des GIF rapides de la même manière que les navigateurs modernes

C'est un composant bien testé que j'ai écrit pour alimenter tous les GIF dans Flipboard .

Raphael Schaad
la source
la propriété frame actuelle retourne mal pour ce framework! github.com/Flipboard/FLAnimatedImage/issues/222
Mo Farhand
12

Une autre alternative consiste à utiliser a UIWebViewpour afficher le GIF animé. Si le GIF doit être récupéré à partir d'un serveur, cela prend en charge la récupération. Il fonctionne également avec les GIF locaux.

ThomasW
la source
Merci. Cela fonctionne bien. Cependant, il peut y avoir un certain retard la première fois que le gif est chargé dans la vue Web, ce qui provoque le «ralenti» de l'animation. si vous voulez qu'il soit plus fluide, animer des cadres partagés dans la réponse à cette question pourrait être mieux.
Hammer le
2
"À partir d'iOS 8.0 et OS X 10.10, utilisez WKWebView pour ajouter du contenu Web à votre application. N'utilisez pas UIWebView ou WebView." developer.apple.com/reference/webkit/wkwebview
Jason Moore
1
Utiliser WebKit pour afficher un GIF, c'est comme acheter un cargo pour transporter vos courses chez vous. Les vues Web sont très très coûteuses et nécessitent l'initialisation d'un JavaScript complet et d'un moteur de rendu. Je recommande vivement d'utiliser une solution de visualisation d'image
Sirens
8

Depuis le cadre iOS 11 Photos, vous pouvez ajouter une lecture de Gifs animés.

Un exemple d'application peut être téléchargé ici

Plus d'informations sur la lecture de Gifs animés (à partir de 13:35 min): https://developer.apple.com/videos/play/wwdc2017/505/

entrez la description de l'image ici

ceinture
la source
hey @sash L'exemple d'application n'a pas de classe "AnimatedImage". Existe-t-il un autre framework que j'importe?
Shabarinath Pabba
@ShabarinathPabba il semble que l'exemple d'application a été mis à jour :(
ceinture
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
la source
Faible utilisation de la mémoire et facile à utiliser, mais
lecture du
1

Vous pouvez utiliser SwiftGif à partir de ce lien

Usage:

imageView.loadGif(name: "jeremy")
David72
la source