показать предварительный просмотр в представлении - PullRequest
1 голос
/ 20 марта 2011

Я пытаюсь показать предварительный просмотр файла в виде, а не на панели.Все примеры, которые я нашел, примерно QLPreviewPanel.:(

Заранее спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 19 января 2012

Я добился некоторого прогресса в этом. Содержимое подслоев было нулевым. Но старомодные работы подпредставлений:

[[[QLPreviewPanel sharedPreviewPanel] contentView] setWantsLayer:YES];
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
NSArray* subviews = [[[QLPreviewPanel sharedPreviewPanel] contentView] subviews] ;
for (id subview in subviews) {
    // The first view is the one we want, which is an unsubclassed NSView.
    // The second is a QLPreviewTitleBarView.  However, instead of relying
    // on that order, we check for the class.
    if ([subview isMemberOfClass:[NSView class]]) {
        NSLog(@"frame of subview: %@", NSStringFromRect([subview frame])) ;
        // The following statement will *remove* the desired subview from
        // the QLPreviewPane and place it into myWindow instead.
        [[myWindow contentView] addSubview:subview];
        break ;
    }
}

Кажется, что даже обновляется myWindow , когда я отправляю -reloadData в QLPreviewPane. Я чувствую себя слизистым Не уверен, что делать дальше, хотя. Одна проблема заключается в том, чтобы иметь дело с произвольным размером подпредставления. Одна из причин, почему мне не нравится QLPreviewPane, заключается в том, что нет контроля над размером окна; он получает представление от генератора в произвольном размере и отображает его на экране. Я думаю, я мог бы поместить это в представление прокрутки. Другая проблема заключается в том, как обращаться с панелью QLPreviewPanel, которая все еще находится на экране. Может быть, установить его происхождение кадра за кадром Но мне нужно идти работать над другой задачей прямо сейчас. Будем благодарны за любые дальнейшие идеи.

Позже. Я думаю, что этот подход будет проблематичным. Сначала я попытался избавиться от окна QLPreviewPane, отправив ему setFrameOrigin: NSMakePoint (10000, 10000) . Результат: [QL] Ошибка подтверждения ([окно события] == окно) - неправильное окно в событии . Затем я попытался пропустить вызов -makeKeyAndOrderFront: и вместо этого пропустить до -reloadData . Результат: [QL] QLError (): - [QLPreviewPanel reloadData] вызывается, когда на панели нет контроллера. Исправьте это или это скоро повысится. Смотрите комментарии в QLPreviewPanel.h для -acceptsPreviewPanelControl: / - beginPreviewPanelControl: / - endPreviewPanelControl:.

Вторая ошибка понятна, однако она указывает на то, что QLPreviewPanel не будет пытаться найти свой источник данных, как он это делает, пока не будет сделан ключ или упорядоченный фронт. Первое утверждение, однако, указывает на то, что, помимо отсутствия надлежащего API для непосредственного получения данных предварительного просмотра, возможно, Apple заложила некоторые ловушки для случайного хакера, такого как я.

Если я вернусь к этому, в следующий раз я попробую более серьезный взлом , предложенный Кеном Апеслахом .

1 голос
/ 25 июля 2012

Начиная с OS X 10.7, существует открытый API для этого: QLPreviewView.h, который является частью инфраструктуры QuickLookUI (которая является частью платформы Quartz).Похоже, документации по нему нет, но заголовочный файл содержит некоторую базовую информацию.

1 голос
/ 25 марта 2011

Кажется, что Apple действительно хочет, чтобы вы использовали QLPreviewPanel;Единственная возможность, которую я вижу, - это "очистить" предварительный просмотр, установив панель на слой с поддержкой и получая содержимое правильного подслоя.Что-то вроде этого (хотя я не заставил его работать):

[[[QLPreviewPanel sharedPreviewPanel] contentView] setWantsLayer:YES];
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
NSLog(@"layer: %@", [[[QLPreviewPanel sharedPreviewPanel] contentView] layer]);
// I believe there are two sublayers
id QLcontents = [[[[[[QLPreviewPanel sharedPreviewPanel] contentView] layer] sublayers] objectAtIndex:0] contents];
NSLog(@"contents: %@", QLcontents);
[myView layer].contents = QLcontents;
[myView layer] setNeedsDisplay];

Ни в коем случае не окончательное решение (оно не работает как есть), но, возможно, оно поможет вамнаправление.

ОБНОВЛЕНИЕ : Просто наткнулся на категорию на NSImage, написанную человеком по имени Мэтт Джеммелл, который использует QLThumbnailImageCreate.Ищите «NSImage + QuickLook» на его странице с исходным кодом .Кажется, он подразумевает, что панель QuickLook действительно использует QLThumbnailImageCreate.Я думаю, что эта функция может быть лучшим способом.Эта категория может немного облегчить вашу жизнь.

...