我见过各种检查-imagePickerController:didFinishPickingMediaWithInfo:
中返回的媒体类型是否为视频的方法。例如,我的方式:
- (void)imagePickerController:(UIImagePickerController *)imagePicker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
if (UTTypeEqual(kUTTypeMovie,
(__bridge CFStringRef)[info objectForKey:UIImagePickerControllerMediaType]))
{
// ...
}
}
或
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
或
if ([mediaType isEqualToString:(NSString *)kUTTypeVideo] ||
[mediaType isEqualToString:(NSString *)kUTTypeMovie])
或
if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0)
== kCFCompareEqualTo)
或
if ([mediaType isEqualToString:@"public.movie"]
每个人似乎都有不同的做法。检查介质类型的推荐方法是什么?优选地,包括“所有图像类型”或“所有视频类型”的方式。
答案 0 :(得分:15)
最好用特定的UTI检查一致性。
现在,iOS告诉你它是public.movie
,但它明年会说些什么?您还会看到有人检查public.video
。很好,所以你已经硬编码了两种类型而不是一种。
但是不要问问"这是一部电影吗?"而不是硬编码您认为iOS将返回的特定类型?有办法做到这一点:
NSString *mediaType = info[UIImagePickerControllerMediaType];
BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType,
kUTTypeMovie) != 0;
如果mediaType代表电影,则使用此方法,如果返回电影(无论返回哪种特定类型),isMovie
应为YES
,因为所有电影均符合kUTTypeMovie
。要非常清楚,如果它是kUTTypeVideo
,这也会将其识别为电影,因为kUTTypeVideo
符合kUTTypeMovie
。
同样,您可以检查返回的内容是否为图像:
NSString *mediaType = info[UIImagePickerControllerMediaType];
BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType,
kUTTypeImage) != 0;
如果返回图片, isIamge
应为YES
,因为所有图片都符合kUTTypeImage
。
请在此处查看Apple的(部分)类型树:Uniform Type Identifiers Are Declared in a Conformance Hierarchy。您可以获得一个不太有用但更完整的列表,列出您的系统当前识别的所有UTI以及它们与shell的一致性:
/System/Library/Frameworks/CoreServices.framework/Frameworks\
/LaunchServices.framework/Versions/A/Support/lsregister -dump
特别是,您可以看到public.video的定义如下:
--------------------------------------------------------
type id: 8344
uti: public.video
description: video
flags: exported active core apple-internal trusted
icon:
conforms to: public.movie
tags:
--------------------------------------------------------
请注意,如果类型相同,UTTypeConformsTo
将返回true
。来自Apple的文档:
如果统一类型标识符等于或符合第二种类型,则返回true。
答案 1 :(得分:2)
我会说第一种方法UTTypeEqual
与第二种和第三种方法(NSString
比较)之间的差异,是处理CFStringRefs
或{{1}时的首选问题}。
第4种类型似乎是通过其实际字符串值引用NSStrings
,您绝对不应该这样做,因为它是私有的并且实际上可能会更改。除此之外,它就像第二种和第三种方法一样。
看起来你可能想要检查几种类型,具体取决于你想要/需要的程度。
我可能会检查kUTTypeMovie
。
kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4