Відображення анімованого GIF у iOS


90

Я помітив, що за допомогою iMessage анімовані GIF-файли тепер можна надсилати та відображати. Чи означає це, що Apple зараз підтримує відображення анімованих GIF-файлів у програмі, чи все-таки найпростіший спосіб розділити зображення на кадри, а потім послідовно показувати їх? Який найпростіший спосіб відобразити анімований GIF станом на iOS 5.1?

Дякую!

Відповіді:


140

Якщо ви націлюєтесь на iOS7 і вже маєте зображення, розділене на кадри, які ви можете використовувати animatedImageNamed:duration:.

Скажімо, ви анімуєте блешню. Скопіюйте всі свої кадри в проект і назвіть їх таким чином:

  • spinner-1.png
  • spinner-2.png
  • spinner-3.png
  • тощо ,

Потім створіть зображення за допомогою:

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

З документів :

Цей метод завантажує серію файлів, додаючи ряд чисел до базового імені файлу, вказаного в параметрі name. Наприклад, якби параметр імені містив у своєму вмісті 'image', цей метод намагався б завантажити зображення з файлів з іменами 'image0', 'image1' і так далі аж до 'image1024'. Усі зображення, включені в анімоване зображення, мають мати однаковий розмір і масштаб.


5
А якщо у вас немає анімації в кадрах, ви можете відкрити GIF у програмі Попередній перегляд і просто перетягнути кадри назовні. Рамки слід витягувати як .tiff, тож дивіться тут: maclife.com/article/howtos/…
Андре

38

Я б рекомендував використовувати наступний код, він набагато легший і сумісний з ARC та не ARC-проектами, він додає просту категорію в UIImageView:

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


1
Не порадив би, якщо вам доведеться відображати кілька gif-
файлів

3
Занадто велике використання пам’яті
Роман Труба

38

FLAnimatedImage - це ефективний анімований механізм GIF з відкритим кодом для iOS:

  • Відтворює кілька GIF-файлів одночасно зі швидкістю відтворення, порівнянною з браузерами для настільних комп'ютерів
  • Зважає на затримки змінних кадрів
  • Поводиться витончено під тиском пам’яті
  • Усуває затримки або блокування під час першого циклу відтворення
  • Інтерпретує затримки кадру швидких GIF-файлів так само, як це роблять сучасні браузери

Це добре перевірений компонент, який я написав для живлення всіх GIF-файлів у Flipboard .


поточна властивість фрейму повертається неправильно з цього фреймворку! github.com/Flipboard/FLAnimatedImage/issues/222
Mo Farhand

12

Інша альтернатива - використовувати a UIWebViewдля відображення анімованого GIF. Якщо файл GIF збирається отримати з сервера, це дбає про вибір. Він також працює з місцевими GIF-файлами.


Дякую. Це працює добре. Однак можуть бути деякі затримки при першому завантаженні 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 Frame дозволяє додавати відтворення анімованих 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

Низький обсяг пам'яті та простий у використанні, але грає у gif дуже повільно
Роман Труба,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.