我正在尝试在View中而不是在面板中显示文件的预览。我找到的所有例子都是QLPreviewPanel
。 :(
提前感谢您的帮助。
答案 0 :(得分: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
撰写。在他的source code page上寻找“NSImage + QuickLook”。他似乎暗示QuickLook Panel实际使用QLThumbnailImageCreate
。我认为这个功能可能是最好的方法。该类别可能会让您的生活更轻松。
答案 1 :(得分: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的原因之一是无法控制窗口大小;它以任意大小从发生器获取视图并在屏幕上将其splats。我想我可以把它放到滚动视图中。另一个问题是如何处理仍在屏幕上的QLPreviewPanel。也许将其框架原点设置为屏幕外但我现在需要继续处理其他任务。任何进一步的想法将不胜感激。
稍后。我认为这种方法会有问题。首先,我尝试通过发送 setFrameOrigin:NSMakePoint(10000,10000)来摆脱QLPreviewPane窗口。结果: [QL]断言失败([事件窗口] ==窗口) - 事件中的窗口错误。然后我尝试省略对 -makeKeyAndOrderFront:的调用,而是跳到 -reloadData 。结果: [QL] QLError(): - 面板没有控制器时调用[QLPreviewPanel reloadData] - 修复此问题或者很快就会出现这种情况。请参阅QLPreviewPanel.h中的注释-acceptsPreviewPanelControl:/ - beginPreviewPanelControl:/ - endPreviewPanelControl:。
第二个错误是可以理解的,但它表明QLPreviewPanel不会尝试查找其数据源,直到它被设置为密钥或有序排序。然而,第一个断言表明,除了没有提供适当的API来直接获取预览数据之外,Apple也可能为像我这样的休闲黑客留下了一些陷阱。
如果我回到这里,下次我会尝试更多serious hack proposed by Ken Apeslagh。
答案 2 :(得分:1)
从OS X 10.7开始,有一个公共API:QLPreviewView.h,它是QuickLookUI框架(它是Quartz框架的一部分)的一部分。它似乎没有文档,但头文件提供了一些基本信息。