Отображение анимированного GIF в iOS

91

Я заметил, что с iMessage теперь можно отправлять и отображать анимированные гифки. Означает ли это, что Apple теперь поддерживает отображение анимированных GIF-файлов в приложении, или это самый простой способ разбить изображение на кадры, а затем последовательно их показывать? Как проще всего отображать анимированный GIF в iOS 5.1?

Благодарность!

Swickblade
источник

Ответы:

140

Если вы ориентируетесь на iOS7 и уже разбили изображение на кадры, вы можете использовать его animatedImageNamed:duration:.

Допустим, вы анимируете спиннер. Скопируйте все свои кадры в проект и назовите их следующим образом:

  • spinner-1.png
  • spinner-2.png
  • spinner-3.png
  • и т. д. ,

Затем создайте изображение с помощью:

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

Из документов :

Этот метод загружает серию файлов, добавляя серию чисел к базовому имени файла, указанному в параметре name. Например, если параметр name имеет в качестве содержимого 'image', этот метод попытается загрузить изображения из файлов с именами 'image0', 'image1' и так далее до 'image1024'. Все изображения, включенные в анимированное изображение, должны иметь одинаковый размер и масштаб.

Джо Масилотти
источник
5
А если у вас нет анимации в кадрах, вы можете открыть GIF в приложении предварительного просмотра и просто перетащить кадры. Фреймы
Андре Фрателли
38

Я бы рекомендовал использовать следующий код, он намного легче и совместим с ARC и не-ARC проектами, он добавляет простую категорию в UIImageView:

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

Эрик
источник
1
Не советовал бы, если вам нужно отображать несколько гифок, работает очень медленно
iago849
3
Слишком большое использование памяти
Роман Труба
38

FLAnimatedImage - это эффективный движок анимированных GIF с открытым исходным кодом для iOS:

  • Одновременное воспроизведение нескольких GIF-файлов со скоростью воспроизведения, сопоставимой с настольными браузерами.
  • Отмечает переменные задержки кадров
  • Ведет себя изящно под давлением памяти
  • Устраняет задержки или блокировку во время первого цикла воспроизведения
  • Интерпретирует задержку кадров быстрых GIF-файлов так же, как это делают современные браузеры.

Это хорошо протестированный компонент, который я написал для поддержки всех GIF-файлов во Flipboard .

Рафаэль Шаад
источник
текущее свойство фрейма возвращается из этого фреймворка неправильно! github.com/Flipboard/FLAnimatedImage/issues/222
Мо Фарханд,
12

Другой альтернативой является использование UIWebViewдля отображения анимированного GIF. Если GIF будет загружен с сервера, это позаботится о загрузке. Он также работает с локальными GIF-файлами.

ThomasW
источник
Спасибо. Это хорошо работает. Однако при первой загрузке gif в веб-просмотр может наблюдаться некоторое отставание, что вызывает «медленное движение» анимации. если вам нужно, чтобы он был более плавным, может быть лучше анимировать кадры, указанные в ответе на этот вопрос.
Hammer
2
«Начиная с iOS 8.0 и OS X 10.10, используйте WKWebView для добавления веб-содержимого в свое приложение. Не используйте UIWebView или WebView». developer.apple.com/reference/webkit/wkwebview
Джейсон Мур,
1
Использование WebKit для отображения GIF-файлов похоже на покупку грузового корабля для перевозки продуктов к вам домой. Веб-представления очень дороги и требуют полной инициализации JavaScript и механизма рендеринга. Я настоятельно рекомендую использовать решение для просмотра изображений
Sirens
8

Из iOS 11 фреймворк Photos позволяет добавлять воспроизведение анимированных Gif-файлов.

Образец приложения можно скачать здесь

Подробнее о воспроизведении анимированных Gif-файлов (начиная с 13:35 мин): https://developer.apple.com/videos/play/wwdc2017/505/

введите описание изображения здесь

пояс
источник
привет @sash В примере приложения нет класса AnimatedImage, есть ли еще одна структура, которую я импортирую?
Шабаринатх Пабба
@ShabarinathPabba, похоже, что образец приложения был обновлен :(
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
Эрик Холли
источник
Низкое потребление памяти и простота использования, но гифки воспроизводятся очень медленно
Роман Труба