我有一个要求,用户需要从库中的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中显示gif文件
发布于 2017-07-24 05:15:44
iOS不给您一种简单的方法来确定--同时使用UIImagePickerController --存储在相机卷中的图片的底层文件格式。苹果的理念是,图像应该被看作是一个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中指出了该文件的代码)。然后你可以自己选择。
附注:您自己的代码无法工作,因为正如内森所指出的,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];
}发布于 2017-07-26 12:48:00
如果您只想在没有选择器的情况下从Photos库中获取资产,则可以使用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];并向资产请求图像如下:
PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *requestOptions = [[PHImageRequestOptions alloc] init];
requestOptions.resizeMode = PHImageRequestOptionsResizeModeExact;
requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
requestOptions.synchronous = true;
[manager requestImageDataForAsset:asset options:requestOptions resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
NSLog(@"Data UTI :%@ \t Info :%@",dataUTI,info);
}];希望这能帮到你!!
发布于 2017-12-01 07:13:25
在iOS 11中,您可以通过智能相册获得所有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>()
}https://stackoverflow.com/questions/45231177
复制相似问题