Как правильно определить тип файла PHASset (GIF)
Я понятия не имею, почему это так сложно. Я пытаюсь определить тип файла PHAsset, в частности, я хочу знать, представляет ли данный объект изображение GIF или нет.
Просто проверка имени файла ресурса говорит мне, что он MP4:
[asset valueForKey:@"filename"] ==> "IMG_XXXX.MP4"
Поддерживает ли iOS преобразование GIF в видеоролики при сохранении в библиотеке изображений устройств? Я также попытался извлечь данные изображения и посмотреть на него dataUTI, но он просто возвращает nil
для GIF (я тоже принимаю все видео). Я извлекаю данные изображения следующим образом:
PHImageManager *manager = asset.imageManager ? asset.imageManager : [PHImageManager defaultManager];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
PHImageRequestOptions *o = [[PHImageRequestOptions alloc] init];
o.networkAccessAllowed = YES;
[manager requestImageDataForAsset:asset.asset options:o resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
dispatch_async(dispatch_get_main_queue(), ^{
CIImage *ciImage = [CIImage imageWithData:imageData];
if(completion) completion(imageData, dataUTI, orientation, info, ciImage.properties);
});
}];
});
dataUTI, возвращенный из вышеуказанного вызова, nil
.
Если кто-то знает о надежном способе определения типа файла PHAsset (я специально ищу GIF, но возможность определить для любого типа файлов будет замечательным), дайте мне знать!
Ответы
Ответ 1
Используйте PHAssetResource.
NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset];
[resourceList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHAssetResource *resource = obj;
if ([resource.uniformTypeIdentifier isEqualToString:@"com.compuserve.gif"]) {
isGIFImage = YES;
}
}];
Ответ 2
Также вы можете найти iformTypeIdentifier из класса PHContentEditingInput. За это; использовать функцию requestContentEditingInput из PHAsset
Не забудь
импортировать MobileCoreServices для kUTTypeGif
Пример кода Swift 3.1:
let options = PHContentEditingInputRequestOptions()
options.isNetworkAccessAllowed = true //for icloud backup assets
let asset : PHAsset = ..... //sampleAsset
asset.requestContentEditingInput(with: options) { (contentEditingInput, info) in
if let uniformTypeIdentifier = contentEditingInput?.uniformTypeIdentifier {
if uniformTypeIdentifier == (kUTTypeGIF as String) {
debugPrint("This asset is a GIF👍")
}
}
}
Ответ 3
Для Swift 3.0 и выше
import MobileCoreServices
var isGIFImage = false
if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String
{
if identifier == kUTTypeGIF as String
{
isGIFImage = true
}
}
Ответ 4
Прежде всего, я не уверен, что вы подразумеваете под GIF-изображением.
Вы имеете в виду Live Photo или Time-lapse?
Однако, если вы хотите проверить текущий актив, это Live Photo, Time-lapse, то вы можете проверить это как
if(asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive)
{
// this is a Live Photo
}
if(asset.mediaSubtypes == PHAssetMediaSubtypeVideoTimelapse)
{
// this is a Time-lapse
}
для определения общего типа файла PHAsset вы можете проверить
asset.mediaType == PHAssetMediaTypeImage
asset.mediaType == PHAssetMediaTypeVideo
asset.mediaType == PHAssetMediaTypeAudio
Ответ 5
//phAsset if object of phAsset
if let imageType = phAsset.value(forKey: "uniformTypeIdentifier") as? String {
if imageType == kUTTypeGIF as String {
//enter code here
}
}
Ответ 6
Я думаю, начиная с iOS 11, мы можем использовать:
if asset.playbackStyle == .imageAnimated {
// try to show gif animation
}