Мой генератор быстрого поиска работал правильно, но теперь он сломан. Это ошибка, или я делаю что-то неправильно?
Вот мой код:
OSStatus GeneratePreviewForURL(void *thisInterface, QLPreviewRequestRef preview, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options) { NSDictionary * myDoc = [NSDictionary dictionaryWithContentsOfURL:(NSURL *)url]; if (myDoc) { NSData * pngData = [myDoc valueForKey:@"pngPreview"]; if (pngData) { QLPreviewRequestSetDataRepresentation(preview,(__bridge CFDataRef)pngData, kUTTypeImage,NULL); } } }
Мой документ - обычный plist с предварительным просмотром png, который хранится в нем как данные. Я проверил, что pngPreview содержит данные png, я создал изображение и его размер был 350 × 350.
Тем не менее, я постоянно получаю эти ошибки:
qlmanage[702] : CGImageCreate: invalid image size: 0 x 0.
qlmanage[702:303] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x9e27, name = 'com.apple.tsm.portname' See /usr/include/servers/bootstrap_defs.h for the error codes.
qlmanage[702:303] *** CFMessagePort: bootstrap_register(): failed 1100 (0x44c) 'Permission denied', port = 0x3f2b, name = 'com.apple.CFPasteboardClient' See /usr/include/servers/bootstrap_defs.h for the error codes.
qlmanage[702:303] Failed to allocate communication port for com.apple.CFPasteboardClient; this is likely due to sandbox restrictions
Мое приложение не является песочницей, поэтому я не думаю, что последние 3 ошибки важны.
Я использовал kUTTypePNG, но попробовал kUTTypeImage безрезультатно (документы для QLPreviewRequestSetDataRepresentation говорят, что поддерживаемые в настоящее время UTI - это kUTTypeImage, kUTTypePDF, kUTTypeHTML , kUTTypeXML, kUTTypePlainText, kUTTypeRTF, kUTTypeMovie и kUTTypeAudio).
Другие моменты, которые следует учитывать: Состояние документов: «Двоичный генератор Quick Look должен быть универсальным и должен быть только 32-разрядным». Эта страница Но на этой странице говорится: «Для OS X v10.6 и более поздних версий вы должны создавать генераторы Quick Look для 32- и 64-разрядных». Что довольно неясно ... Как установить свою цель?
Опираясь на ту же проблему, я решил пойти альтернативным путем: используйте QLPreviewRequestCreateContext, чтобы получить контекст, в котором можно сделать мое изображение в:
QLPreviewRequestRef preview; // The preview request passed to GeneratePreviewForURL()
CGImageRef image; // Create your CGImage however you like
CGSize size = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image));
CGContextRef ctxt = QLPreviewRequestCreateContext(preview, size, YES, nil);
CGContextDrawImage(ctxt, CGRectMake(0, 0, size.width, size.height), image);
QLPreviewRequestFlushContext(preview, ctxt);
CGContextRelease(ctxt);
По крайней мере, это работает ...
CFDataRef imgData = (__bridge CFDataRef)pngData;
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (imgData);
CGImageRef image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
– wdyp 11 October 2014 в 22:48