2013-03-25 14 views
6

Widziałem różne metody sprawdzania, czy zwróconym typem nośnika jest -imagePickerController:didFinishPickingMediaWithInfo: wideo. Na przykład, moja droga:Określanie, czy typ materiału służącego do selekcji obrazów jest wideo

- (void)imagePickerController:(UIImagePickerController *)imagePicker 
didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    if (UTTypeEqual(kUTTypeMovie, 
    (__bridge CFStringRef)[info objectForKey:UIImagePickerControllerMediaType])) 
    { 
     // ... 
    } 
} 

lub

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType]; 
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) { 

lub

if ([mediaType isEqualToString:(NSString *)kUTTypeVideo] || 
    [mediaType isEqualToString:(NSString *)kUTTypeMovie]) 

lub

if (CFStringCompare ((__bridge CFStringRef) mediaType, kUTTypeMovie, 0) 
     == kCFCompareEqualTo) 

lub

if ([mediaType isEqualToString:@"public.movie"] 

Każdy wydaje się mieć inny sposób robienia tego. Jaka jest zalecana metoda sprawdzania rodzaju nośnika? Najlepiej ze sposobem na uwzględnienie "wszystkich typów obrazów" lub "wszystkich typów wideo".

Odpowiedz

2

by powiedzieć, że różnica pomiędzy pierwszym sposobie UTTypeEqual a drugi i trzeci metodami (NSString porównanie), jest sprawą preferencji w rozwiązywaniu CFStringRefs lub NSStrings.

Wygląda na to, że czwarty typ odwołuje się do kUTTypeMovie przez jego rzeczywistą wartość ciągu, której absolutnie nie należy robić, ponieważ jest ona prywatna i może się zmienić. Poza tym jest tak jak druga i trzecia metoda.

Wygląda na to, że prawdopodobnie będziesz chciał sprawdzić kilka typów w zależności od tego, jak dokładnie chcesz/trzeba być.

Najprawdopodobniej sprawdziłbym pod kątem kUTTypeAudiovisualContent, KUTTypeMovie, KUTTypeVideo, kUTTypeQuickTimeMovie, kUTTypeMPEG, kUTTypeMPEG4.

Pełna lista ze UTType Reference

kUTTypeAudiovisualContent 
An abstract type identifier for audio and/or video content. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMovie 
An abstract type identifier for a media format which may contain both video and audio. Corresponds to what users would label a "movie" 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeVideo 
An abstract type identifier for pure video data(no audio). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAudio 
An abstract type identifier for pure audio data (no video). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeQuickTimeMovie 
The type identifier for a QuickTime movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG 
The type identifier for a MPEG-1 or MPEG-2 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4 
The type identifier for a MPEG-4 movie. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMP3 
The type identifier for MP3 audio. 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeMPEG4Audio 
The type identifier for a MPEG-4 audio layer (.m4a, or the MIME type audio/MP4). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 

kUTTypeAppleProtectedMPEG4Audio 
The type identifier for Apple protected MPEG4 format (.m4p, iTunes music store format). 
Available in iOS 3.0 and later. 
Declared in UTCoreTypes.h. 
13

Byłoby lepiej, aby sprawdzić zgodności ze szczególnym UTI zamiast.

Teraz iOS mówi, że to jest public.movie, ale co powie w przyszłym roku? Zobaczysz też osoby sprawdzające pod numerem public.video. Świetnie, więc masz zakodowane dwa typy zamiast jednego.

Ale czy nie byłoby lepiej zapytać "Czy to jest film?" zamiast twardego kodu konkretnego typu, który według Ciebie iOS powróci? Istnieje sposób, aby to zrobić:

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isMovie = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeMovie) != 0; 

Stosując to podejście, isMovie powinny być YES jeśli film jest zwracana (niezależnie od tego, który jest zwracany specyficzny typ) jeśli MediaType reprezentuje film, ponieważ wszystkie filmy są zgodne z kUTTypeMovie. Aby być naprawdę jasnym, jeśli jest to kUTTypeVideo, rozpozna to również jako film, ponieważ kUTTypeVideo jest zgodny z kUTTypeMovie.

Podobnie można sprawdzić, czy sprawa wróciła to zdjęcie:

NSString *mediaType = info[UIImagePickerControllerMediaType]; 
BOOL isImage = UTTypeConformsTo((__bridge CFStringRef)mediaType, 
           kUTTypeImage) != 0; 

isIamge powinny być YES jeśli obraz jest zwrócony, ponieważ wszystkie obrazy są zgodne z kUTTypeImage.

Zobacz drzewo Apple (częściowe) tutaj: Uniform Type Identifiers Are Declared in a Conformance Hierarchy. Można dostać się mniej użyteczne, ale bardziej kompletną listę wszystkich ZUM obecnie rozpoznawane przez system, a ich zgodność z powłoki z:

/System/Library/Frameworks/CoreServices.framework/Frameworks\ 
/LaunchServices.framework/Versions/A/Support/lsregister -dump 

W szczególności widać public.video jest zdefiniowany następująco:

-------------------------------------------------------- 
type id:   8344 
    uti:   public.video 
    description: video 
    flags:   exported active core apple-internal trusted 
    icon:   
    conforms to: public.movie 
    tags:   
-------------------------------------------------------- 

Należy pamiętać, że UTTypeConformsTo zwraca true, jeśli typy są takie same jak również. Z dokumentacji firmy Apple:

Zwraca wartość true, jeśli identyfikator typu jednolitego jest równy lub zgodny z drugim typem.

+1

Nie jestem pewien, jak to się tutaj działo bez głosów oddanych na tak długo. To najlepsze podejście, jakie widziałem na SO. – Toby

+0

Podoba mi się również twoje podejście. Dużo za to rozwiązanie. – iWheelBuy

+0

Gdy natkniesz się na te API, to naprawdę jedyny, który w ogóle ma sens. :) –

Powiązane problemy