ios – 确定图像选择器媒体类型是否为视频

我已经看到了各种方法来检查-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"]

每个人似乎都有不同的做法.检查介质类型的推荐方法是什么?优选地,包括“所有图像类型”或“所有视频类型”的方式.

解决方法

最好检查一下与特定UTI的一致性.

现在,iOS告诉你它是一个public.movi​​e,但它明年会说些什么呢?你会看到有人检查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的文档:

Returns true if the uniform type identifier is equal to or conforms to the second type.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...