我要求用户需要从库中的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
我该如何解决这个问题?如果此处不支持kUTTypeGIF
媒体,如何向用户显示所有gif文件列表以供选择?我只需要在UIImagePickerController
答案 0 :(得分:3)
在使用UIImagePickerController时,iOS不会为您提供一种简单的方法来确定相机胶卷中存储的图片的基础文件格式。 Apple的理念是,图像应该被视为UIImage
对象,您不应该关心最终文件格式是什么。
因此,您无法使用UIImagePickerController过滤掉GIF文件。这里有几种可能性:
1)
选择图像后,您可以确定它是什么类型的文件。 Here's an example question that asks how to determine if the image is a PNG or JPEG。用户选择文件后,您就会知道它是GIF,JPEG还是PNG等等。
2)
您可以将任何UIImage转换为GIF
文件。 Here's a question that points to a library that might be able to help
3)
您可以遍历整个相机胶卷,并将这些图像转换/保存到应用程序的文档目录中,作为GIF
文件。从with enumeration found in this related question开始然后通过ImageIO框架运行每个图片以将其转换为gif文件(我在解决方案#2中指出的代码)的东西。然后你可以自己选择一个选择器。
P.S。你自己的代码没有用,因为正如内森指出的那样,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];
}
答案 1 :(得分:3)
如果您只想在没有选择器的情况下从照片库中获取资源,则可以使用$parameters
获取PHFetchResult
的数组。以下是PHAsset
中可用的MediaType enums
列表:
Photos.Framework
您可以将其用作:
typedef NS_ENUM(NSInteger, PHAssetMediaType) {
PHAssetMediaTypeUnknown = 0,
PHAssetMediaTypeImage = 1,
PHAssetMediaTypeVideo = 2,
PHAssetMediaTypeAudio = 3,
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
并从资产请求图片:
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
希望这会对你有所帮助!!
答案 2 :(得分:2)
在iOS 11中,您可以通过Smart Album获取所有gif。
func getGif() -> PHFetchResult<PHAsset> {
if let gifCollection = PHAssetCollection.fetchAssetCollections(with: .smartAlbum, subtype: .smartAlbumAnimated, options: nil).firstObject {
return PHAsset.fetchAssets(in: gifCollection, options: nil)
}
return PHFetchResult<PHAsset>()
}