Использование встроенных иконок для MIME-типа или UTI-типа в iOS - PullRequest
13 голосов
/ 04 мая 2011

Проблема:

Я хотел бы иметь возможность использовать встроенные значки iOS для стандартных типов MIME (или типов UTI) в моем списке содержимого двоичных файлов.

Справочная информация:

Я рассмотрел использование новой (начиная с 3.2) архитектуры документов, но при использовании UIDocumentInteractionController кажется, что предполагается, что фактические двоичные файлы уже находятся на локальном устройстве.

В моем случае у меня есть список файлов с удаленного сервера и я знаю тип mime, имя, заголовок и т. Д. Для удаленного файла, поэтому я просто хочу показать список файлов с иконками (фактический двоичный файл загружается только при необходимости ).

Метаданные, которые я получаю с сервера, содержат надлежащие типы MIME для двоичных файлов, поэтому в теории я просто хочу получить системный значок в зависимости от типа.

Обойтись?

Я попробовал следующий «взлом» в качестве доказательства концепции, и, похоже, он работает, но это не лучший способ ...

//Need to initialize this way or the doc controller doesn't work
NSURL*fooUrl = [NSURL URLWithString:@"file://foot.dat"];
UIDocumentInteractionController* docController = [[UIDocumentInteractionController interactionControllerWithURL:fooUrl] retain];

UIImage* thumbnail = nil;
//Need to convert from mime type to a UTI to be able to get icons for the document
NSString *uti = [NSMakeCollectable(UTTypeCreatePreferredIdentifierForTag(kUTTagClassMIMEType, (CFStringRef)self.contentType, NULL)) autorelease];

//Tell the doc controller what UTI type we want
docController.UTI = uti;

//The doc controller now seems to have icon(s) for the type I ask for...
NSArray* icons = docController.icons;
if([icons count] > 0) {
    thumbnail = [icons objectAtIndex:0];
}
return thumbnail;

Ответы [ 3 ]

12 голосов
/ 20 июня 2012

Вы можете создать UIDocumentInteractionController без указания URL-адреса. Заголовок для класса говорит, что значки определяются как name, если установлено, URL в противном случае.

UIDocumentInteractionController* docController = [[UIDocumentInteractionController alloc] init];
docController.name = @"foo.dat";
NSArray* icons = docController.icons;
// Do something with icons
...
[docController release];
10 голосов
/ 14 февраля 2013

Я попробовал решение Бена Линса , но оно не работало на iOS6.1 ни в симуляторе, ни на моем iPad3.Вам необходимо предоставить NSURL для UIDocumentInteractionController, но этот URL не должен существовать.Его последний компонент пути просто должен иметь желаемое расширение.

Следующий код работал для меня

NSString *extension = @"pptx"; // or something else
NSString *dummyPath = [@"~/foo" stringByAppendingPathExtension:extension]; // doesn't exist
NSURL *URL = [NSURL fileURLWithPath:dummyPath];
UIDocumentInteractionController *documentInteractionController = [UIDocumentInteractionController interactionControllerWithURL:URL];
NSArray *systemIconImages = documentInteractionController.icons;

return systemIconImages;
1 голос
/ 27 мая 2011

Итак, мы говорим о взломах, а?Я сделал это, делая плохие вещи, но это работает ... Я скопировал иконки из /system/library/frameworks/QuickLook.framework и добавил в свой проект.Внутри этой же папки есть несколько списков свойств, которые связывают UTI / extension / mime-type с файлом png.С plist и pngs все, что вам нужно сделать, - это создать логику, чтобы прочитать списки и показать правильный png.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...