列出照片库中的所有gif文件

Bal*_*ali 10 objective-c uiimagepickercontroller ios

我有一个要求,用户需要从库中的gif文件列表中获取gif.我试图获取图像和视频没有任何问题.但是当我用作kUTTypeGIF媒体时,它会因错误而崩溃:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'没有可用的源0类型'

这是我的代码:

#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>

@interface ViewController ()<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(IBAction)btnChooseGif:(id)sender {
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeGIF, nil];   // Here is the crash 
    [self presentViewController:imagePicker animated:YES completion:nil];
}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{

}
@end
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?如果kUTTypeGIF此处不支持媒体,如何向用户显示所有gif文件列表以供选择?我只需要在UIImagePickerController中显示gif文件

Mic*_*ann 3

iOS 并没有为您提供一种简单的方法来确定(在使用 UIImagePickerController 时)存储在相机胶卷中的图片的底层文件格式是什么。Apple 的理念是,图像应该被视为一个UIImage对象,并且您不应该关心最终的文件格式是什么。

所以,既然你不能使用 UIImagePickerController 来过滤掉 GIF 文件。这里有几种可能性供您选择:

1)

选择图像后,您可以确定它是什么类型的文件。 下面是一个示例问题,询问如何确定图像是 PNG 还是 JPEG。一旦用户选择一个文件,您就会知道它是 GIF、JPEG、PNG 还是其他文件。

2)

您可以将任何 UIImage转换GIF为文件。这是一个指向可能能够提供帮助的图书馆的问题

3)

您可以迭代整个相机胶卷,并将这些图像作为GIF文件转换/保存到应用程序的文档目录中。从这个相关问题中找到的枚举开始,然后通过 ImageIO 框架运行每张图片,将其转换为 gif 文件(我在解决方案#2 中指出的代码)。然后您可以滚动自己的选择器。

ps 你自己的代码不会工作,因为正如 Nathan 指出的那样,gif它不是一种媒体类型。这是一个指出可用媒体类型的函数:

-(IBAction)btnChooseGif:(id)sender {
    NSArray *availableMedia = [UIImagePickerController availableMediaTypesForSourceType: UIImagePickerControllerSourceTypePhotoLibrary];

    NSLog(@"availableMedia is %@", availableMedia);

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    imagePicker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)kUTTypeImage, nil];
    [self presentViewController:imagePicker animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)