2017-07-21 11 views
8

मुझे एक आवश्यकता है जिसमें उपयोगकर्ता को लाइब्रेरी में gif फ़ाइलों की सूची से एक gif लाने की आवश्यकता है। मैंने बिना किसी समस्या के दोनों छवियों को & वीडियो लाने की कोशिश की। 'स्रोत के लिए कोई उपलब्ध प्रकार 0'फोटो लाइब्रेरी में सभी gif फ़ाइलों को सूचीबद्ध करें

यहाँ मेरी है:

समाप्त एप्लिकेशन न आया हुआ अपवाद 'NSInvalidArgumentException' के कारण, कारण: लेकिन जब मैं kUTTypeGIF मीडिया के रूप में इस्तेमाल होने वाले इस त्रुटि के साथ दुर्घटनाओं कोड:

#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

जांच इस https://stackoverflow.com/questions/37934698/how-to-load-animated-gif-from-photo-library –

+0

@DSDharma यह मेरा मुद्दा नहीं है। मैं चाहता हूं कि मेरा ऐप छवि पिकर में सभी gif फ़ाइलों को सूचीबद्ध करे। उपयोगकर्ता को – Bali

+2

जीआईएफ वैध मीडिया प्रकार नहीं है, तो फोन में केवल जीआईएफ फाइलों को देखने में सक्षम होना चाहिए। अनुमत मीडिया प्रकार 'छवि' और 'मूवी' हैं। आप 'UIImagePickerController.availableMediaTypes (के लिए: .photoLibrary) के लिए स्वीकृत प्रकारों की जांच करें ' – nathan

उत्तर

3

आईओएस आपको निर्धारित करने का एक आसान तरीका नहीं देता है - UIImagePickerController का उपयोग करते समय - कैमरा रोल में संग्रहीत चित्रों के लिए अंतर्निहित फ़ाइल प्रारूप क्या है। यहां ऐप्पल का दर्शन यह है कि एक छवि को UIImage ऑब्जेक्ट के रूप में सोचा जाना चाहिए और आपको परवाह नहीं करना चाहिए कि अंतिम फ़ाइल प्रारूप क्या है।

इसलिए, चूंकि आप GIF फ़ाइलों को फ़िल्टर करने के लिए UIImagePickerController का उपयोग नहीं कर सकते हैं। यहाँ आप के लिए एक जोड़े संभावनाएं है:

1)

एक बार जब आप कोई चित्र चुनें, आप यह निर्धारित कर सकते हैं किस प्रकार की फ़ाइल यह है। Here's an example question that asks how to determine if the image is a PNG or JPEG। एक बार जब उपयोगकर्ता एक फ़ाइल चुनता है, तो आप जान लेंगे कि यह एक जीआईएफ या जेपीईजी या पीएनजी या जो कुछ भी है।

2)

आप एक GIF फाइल करने के लिए किसी भी UIImage परिवर्तित कर सकते हैं। Here's a question that points to a library that might be able to help

3)

आप पूरे कैमरा रोल भर में पुनरावृति और परिवर्तित कर सकते हैं/GIF फ़ाइलों में आपके एप्लिकेशन के दस्तावेजों निर्देशिका में उन छवियों को बचाने के। कुछ ऐसा जो with enumeration found in this related question से शुरू होता है और उसके बाद छवि चित्र फ्रेमवर्क के माध्यम से प्रत्येक चित्र को एक 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]; 
} 
3

आप केवल पिकर बिना फ़ोटो लाइब्रेरी से संपत्ति लाने के लिए चाहते हैं, आप PHAsset की सरणी प्राप्त करने के लिए PHFetchResult उपयोग कर सकते हैं: यह एक समारोह है कि बताते हैं उपलब्ध मीडिया प्रकार है।

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

और अनुरोध चित्र संपत्ति से के रूप में:

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

आप इसे के रूप में उपयोग कर सकते हैं:

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

आशा इस तुम्हारी मदद करेगा नीचे Photos.Framework में उपलब्ध उपलब्ध MediaType enums की सूची है !!

1

आईओएस 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>() 
} 
संबंधित मुद्दे