2017-07-21 28 views
8

Kullanıcının bir gif dosyasını kitaplıktaki bir gif dosyası listesinden alması gereken bir gereksinim var. Ben herhangi bir sorun olmadan iki görüntü & Videolar getirmeye çalıştım. Uygulamayı SonlandırmaFotoğraf kitaplığında yer alan tüm gif dosyalarını listele

nedeniyle yakalanmamış istisna 'NSInvalidArgumentException' için akıl: Ben medya olarak kUTTypeGIF kullanıldığında Ama, hatasıyla çöküyor 'kaynak için kullanılabilir tipleri 0'

İşte

benim olduğunu kod:

#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 

ben bu çözebilir nasıl? Ve burada kUTTypeGIF medya desteklenmiyorsa, listeyi seçmek için tüm gif dosyalarını listeye nasıl gösterebilirim? Gif dosyalarını sadece UIImagePickerController

+0

onay bu https://stackoverflow.com/questions/37934698/how-to-load-animated-gif-from-photo-library –

+0

@DSDharma Bu benim sorun değildir. Uygulamamın görsel seçimindeki tüm gif dosyalarını listelemesini istiyorum. Kullanıcı, – Bali

+2

seçiminde yalnızca gif dosyalarını görebilmeli. GIF geçerli bir medya türü değil. İzin verilen medya türleri, "görüntü" ve "film" dir. "UIImagePickerController.availableMediaTypes (for: .photoLibrary)' – nathan

cevap

3

'da görüntülemem gerekir. IOS, UIImagePickerController kullanırken - temel dosya formatının kamera rulosunda saklanan resimler için ne anlama geldiğini belirlemenin kolay bir yolunu vermez. Apple'ın felsefesi, bir görüntünün, bir UIImage nesnesi olarak düşünülmesi ve nihai dosya formatının ne olduğu umrumda olmamalıdır.

Bu nedenle, GIF dosyalarını filtrelemek için UIImagePickerController kullanamazsınız. İşte size bir kaç olanakları var: Bir görüntüyü ekledikten sonra

1)

, sen bir dosya olduğunu ne tür belirleyebilir. Here's an example question that asks how to determine if the image is a PNG or JPEG. Kullanıcı bir dosya seçtiğinde, bir GIF veya JPEG veya PNG veya herhangi bir şey olup olmadığını öğrenirsiniz.

2)

Sen bir GIF dosyaya herhangi UIImage dönüştürebilirsiniz. Here's a question that points to a library that might be able to help.

3)

Sen tüm kamera rulo boyunca yineleme ve dönüştürmek/GIF dosyaları olarak uygulamanızın belgeler dizine bu görüntüleri kurtarabilir. with enumeration found in this related question'u başlatan ve daha sonra her görüntüyü bir gif dosyasına (çözüm # 2'de işaret ettiğim kod) dönüştürmek için ImageIO çerçevesinde çalışır. Daha sonra kendi seçicinizi yuvarlayabilirsiniz.

p.s. Kendi kodunuz işe yaramayacaktı çünkü Nathan'ın işaret ettiği gibi, gif bir medya türü değil. Yalnızca seçici olmadan Fotoğraflar kütüphaneden varlıkları alıp istiyorsanız

-(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]; 
} 
3

, sen PHAsset dizisini almak için PHFetchResult kullanabilirsiniz: Bu mevcut medya türlerini işaret bir fonksiyondur.Bu size yardımcı olacaktır

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); 
      }]; 

Hope: olarak varlıktan

PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil]; 

ve istek görüntüsü:

typedef NS_ENUM(NSInteger, PHAssetMediaType) { 
PHAssetMediaTypeUnknown = 0, 
PHAssetMediaTypeImage = 1, 
PHAssetMediaTypeVideo = 2, 
PHAssetMediaTypeAudio = 3, 
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0); 

Sen olarak kullanabilirsiniz: Aşağıda Photos.Framework mevcut mevcut MediaType enums listesidir !!

1

iOS 11'de Smart Album tarafından tüm gifleri alabilirsiniz.

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>() 
}