1

我试图在视图而不是面板中显示文件的预览。我发现的所有例子都是关于QLPreviewPanel. :(

在此先感谢您的帮助。

4

3 回答 3

1

看起来 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,由一个名叫 Matt Gemmell 的家伙编写,它使用QLThumbnailImageCreate. 在他的源代码页面上查找“NSImage+QuickLook” 。他似乎暗示 QuickLook Panel 实际上使用QLThumbnailImageCreate. 我认为该功能可能是最好的方法。该类别可能会让您的生活更轻松。

于 2011-03-24T22:11:32.827 回答
1

从 OS X 10.7 开始,有一个公共 API:QLPreviewView.h,它是 QuickLookUI 框架的一部分(它是 Quartz 框架的一部分)。似乎没有关于它的文档,但头文件提供了一些基本信息。

于 2012-07-24T21:55:03.073 回答
1

我在这方面取得了一些进展。子层的内容为零。但是老式的子视图有效:

[[[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 ;
    }
}

当我将 -reloadData 发送到 QLPreviewPane 时,它​​甚至似乎更新了myWindow 。我感觉黏糊糊的。不过,不确定下一步该做什么。一个问题是处理子视图的任意大小。我不喜欢 QLPreviewPane 的原因之一是无法控制窗口大小;它从生成器中获取任意大小的视图并将其显示在屏幕上。我想我可以把它放到滚动视图中。另一个问题是如何处理仍在屏幕上的 QLPreviewPanel。也许将其帧原点设置为屏幕外但我现在需要去做另一项任务。任何进一步的想法将不胜感激。

之后。 我认为这种方法会有问题。首先,我尝试通过向 QLPreviewPane 窗口发送setFrameOrigin:NSMakePoint(10000, 10000)来摆脱它。结果:[QL] 断言失败([事件窗口] == 窗口)- 事件中的错误窗口。然后我尝试省略对-makeKeyAndOrderFront:的调用,而是跳到-reloadData。结果:[QL] QLError(): -[QLPreviewPanel reloadData] 在面板没有控制器时调用 - 修复此问题,否则此问题将很快引发。请参阅 QLPreviewPanel.h 中有关 -acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl: 的注释。

第二个错误是可以理解的,但是它表明 QLPreviewPanel 不会像它那样尝试找到它的数据源,直到它成为键或排序在前面。然而,第一个断言表明,除了没有提供适当的 API 来直接获取预览数据之外,苹果可能还为像我这样的普通黑客设置了一些陷阱。

如果我回到这个,下次我会尝试由 Ken Apeslagh 提出的更严肃的 hack

于 2012-01-19T19:10:01.103 回答