Exibir GIF animado no iOS

90

Percebi que com o iMessage, gifs animados agora podem ser enviados e exibidos. Isso significa que a Apple agora oferece suporte à exibição de GIFs animados em um aplicativo ou o método mais fácil ainda é dividir a imagem em quadros e depois mostrá-los sequencialmente? Qual é a maneira mais fácil de exibir um GIF animado no iOS 5.1?

Obrigado!

swickblade
fonte

Respostas:

140

Se você tem como alvo o iOS7 e já tem a imagem dividida em frames, você pode usar animatedImageNamed:duration:.

Digamos que você esteja animando um spinner. Copie todos os seus quadros no projeto e nomeie-os da seguinte maneira:

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

Em seguida, crie a imagem por meio de:

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

Dos documentos :

Este método carrega uma série de arquivos anexando uma série de números ao nome do arquivo base fornecido no parâmetro name. Por exemplo, se o parâmetro de nome tivesse 'imagem' como seu conteúdo, este método tentaria carregar imagens de arquivos com os nomes 'imagem0', 'imagem1' e assim por diante até 'imagem1024'. Todas as imagens incluídas na imagem animada devem compartilhar o mesmo tamanho e escala.

Joe Masilotti
fonte
5
E se você não tiver a animação em quadros, pode abrir um GIF no aplicativo de visualização e apenas arrastar os quadros para fora. Os frames devem ser extraídos como .tiff, então veja aqui: maclife.com/article/howtos/…
André Fratelli
38

Eu recomendaria usar o seguinte código, é muito mais leve e compatível com projetos ARC e não ARC, e adiciona uma categoria simples em UIImageView:

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

Eric
fonte
1
Não aconselharia se você tivesse que exibir vários gifs, funciona muito lento
iago849
3
Uso de memória muito alto
Roman Truba,
38

FLAnimatedImage é um mecanismo GIF animado de código aberto de alto desempenho para iOS:

  • Reproduz vários GIFs simultaneamente com uma velocidade de reprodução comparável a navegadores de desktop
  • Aceita atrasos de quadro variáveis
  • Comporta-se elegantemente sob pressão de memória
  • Elimina atrasos ou bloqueios durante o primeiro loop de reprodução
  • Interpreta os atrasos de quadro de GIFs rápidos da mesma forma que os navegadores modernos fazem

É um componente testado que escrevi para alimentar todos os GIFs no Flipboard .

Raphael Schaad
fonte
a propriedade do quadro atual está retornando errado para este quadro! github.com/Flipboard/FLAnimatedImage/issues/222
Mo Farhand
12

Outra alternativa é usar um UIWebViewpara exibir o GIF animado. Se o GIF for obtido de um servidor, isso cuidará da busca. Também funciona com GIFs locais.

ThomasW
fonte
Obrigado. Isso funciona bem. No entanto, pode haver algum atraso na primeira vez que o GIF é carregado no webview, o que causa o 'movimento lento' da animação. se vc quiser que seja mais suave, animar frames compartilhados na resposta a esta pergunta pode ser melhor.
Martelo,
2
"A partir do iOS 8.0 e OS X 10.10, use WKWebView para adicionar conteúdo da web ao seu aplicativo. Não use UIWebView ou WebView." developer.apple.com/reference/webkit/wkwebview
Jason Moore
1
Usar o WebKit para exibir um GIF é como comprar um navio de carga para transportar suas compras até sua casa. As visualizações da Web são muito caras e exigem a inicialização de um mecanismo de renderização e JavaScript completo. Eu recomendo usar uma solução de visualização de imagem
Sirens
8

A partir do iOS 11, a estrutura de fotos permite adicionar a reprodução de Gifs animados.

O aplicativo de amostra pode ser baixado aqui

Mais informações sobre a reprodução de Gifs animados (a partir de 13:35 min): https://developer.apple.com/videos/play/wwdc2017/505/

insira a descrição da imagem aqui

faixa
fonte
hey @sash O aplicativo de amostra não tem a classe "AnimatedImage". Há outra estrutura que estou importando?
Shabarinath Pabba
@ShabarinathPabba, parece que o aplicativo de amostra foi atualizado :(
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
fonte
Baixo uso de memória e fácil de usar, mas reproduz GIF muito devagar
Roman Truba,
1

Você pode usar o SwiftGif neste link

Uso:

imageView.loadGif(name: "jeremy")
david72
fonte