在iOS中显示动画GIF

91

我注意到在iMessage中现在可以发送和显示动画GIF了。这是否意味着Apple现在支持在应用程序中显示动画GIF,还是最简单的方法仍然是将图像分成帧,然后按顺序显示它们?截至iOS 5.1,显示动画GIF的最简单方法是什么?

谢谢!

9个回答

144
如果您的目标是iOS7,并且已经将图像拆分为帧,则可以使用animatedImageNamed:duration:。假设您要对旋转器进行动画处理,请将所有框架复制到项目中并按以下方式命名:
- spinner-1.png - spinner-2.png - spinner-3.png - 以此类推
然后通过以下方式创建图像:
[UIImage animatedImageNamed:@"spinner-" duration:1.0f];

来自官方文档

此方法通过向提供的名称参数添加一系列数字来加载一系列文件。例如,如果名称参数包含“image”,则此方法将尝试从带有名称“image0”、“image1”等的文件中加载图像,一直到“image1024”。 动画图像中包含的所有图像应具有相同的大小和比例。


6
如果你没有逐帧动画,你可以在预览应用程序中打开一个 GIF 并将帧拖出来。这些帧应该会被提取为 .tiff 格式,然后参考这里:http://www.maclife.com/article/howtos/how_batch_convert_images_your_mac_without_photoshop - André Fratelli

38

1
如果你需要显示多个 GIF 图片的话,不建议这样做,因为会运行得非常缓慢。 - iago849
3
内存使用过高。 - Roman Truba

38

FLAnimatedImage是iOS的一款高效的开源动态GIF引擎:

  • 可以同时播放多个GIF,播放速度与桌面浏览器相当
  • 支持变量帧延迟
  • 在内存压力下表现优雅
  • 消除了第一次播放循环期间的延迟或阻塞
  • 以现代浏览器相同的方式解释快速GIF的帧延迟

这是一个经过充分测试的组件,我编写它是为了支持Flipboard中的所有GIF


当前帧属性对于这个框架返回错误! https://github.com/Flipboard/FLAnimatedImage/issues/222 - Mo Farhand

13
另一个选择是使用 UIWebView 来显示动画GIF。如果该GIF将从服务器获取,则此操作会负责获取。它还适用于本地GIF。

谢谢。这个很好用。然而,第一次加载gif到webview时可能会有一些延迟,导致动画出现“慢动作”。如果您需要更流畅的效果,可以使用答案中分享的动画帧来实现。 - Hammer
2
从iOS 8.0和OS X 10.10开始,使用WKWebView将Web内容添加到您的应用程序中。不要使用UIWebView或WebView。https://developer.apple.com/reference/webkit/wkwebview - Jason Moore
1
使用WebKit来显示GIF就像购买一艘货船来运送你的杂货回家一样。Web视图非常昂贵,需要初始化完整的JavaScript和渲染引擎。我强烈建议使用图像视图解决方案。 - Allison

8

嘿@sash,示例应用程序中没有“AnimatedImage”类,我导入了另一个框架吗? - Shabarinath Pabba
@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非常缓慢。 - Roman Truba

2
你可以从这个链接使用SwiftGif。
用法:
imageView.loadGif(name: "jeremy")

1
NSString *pathForGif = [[NSBundle mainBundle] pathForResource:@"ic_homepage_random0330" ofType: @"gif"];

NSData *gifData = [NSData dataWithContentsOfFile:pathForGif];
                
YYImage *img = [YYImage imageWithData:gifData];

YYAnimatedImageView *contentImageView = [[YYAnimatedImageView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
contentImageView.autoPlayAnimatedImage = YES;
contentImageView.image = img;

1
在2021年,将gif拆分为单独的帧仍然是有效的解决方案。
以下是已接受答案适用于Swift:
1. 使用在线服务(如ezygif)将gif拆分为单个帧:https://ezgif.com/split/ 确保将它们导出为.png格式。 2. 创建一个xcassets档案,并为每个帧创建一个资源。确保差异只是后缀,应为gif的每个帧都应该有一个数字后缀(例如animated-image-1,animated-image-2等)。我使用单一比例使其更容易。 3. 将其加载到图像视图中:
final class AnimatedImage: UIImageView {
    init() {
        super.init(frame: .zero)

        let animatedImage = UIImage.animatedImageNamed("animated-image-", duration: 0.3)
        translatesAutoresizingMaskIntoConstraints = false
        image = animatedImage

        NSLayoutConstraint.activate([
            widthAnchor.constraint(equalToConstant: 150),
            heightAnchor.constraint(equalTo: widthAnchor)
        ])
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接