简介
QuickLook是Mac10.5引用的一项新特性,允许在Finder中快速预览多种不同类型的文件。不需要打开文件,只需要按下空格键就可以通过QuickLook快速预览文件内容。QuickLook采用的是可扩展的架构,使得大部分的工作都由插件完成。这些插件的后缀为.qlgenerator的bundle,只要将bundle文件拖放在QuickLook目录下就可以完成插件的安装(系统范围的QuickLook目录为/System/Libaray/QuickLook,针对个人的QuickLook目录为~/Libaray/QuickLook)。
实际的插件是一个特效编译的程序--但不是一个独立的可执行程序。插件程序没有传统的main()入口点。而是实现了QuickLookGeneratorPluginFactory入口点。另外还有一个配置文件负责将插件和对应的文件类型关联起来,文件类型通过苹果的UTI表示,也就是逆DNS表示法。举个例子:
在我电脑~/Libaray/QuickLook目录下面有一个SogouSkinFileQuickLook.glgenerator文件,查看其可执行文件的Load command。是没有LC_MAIN(设置程序主线程入口地址和栈大小)命令的.
quicklookd是系统的“QuickLook”服务器,是通过/System/Libaray/LaunchAgents/com.apple.quicklook.plist文件在登录中启动的。这个后台服务程序本身就在QuickLook框架中,其程序路径在
/System/Library/Frameworks/QuickLook.framework/Versions/A/Resources/quicklookd.app。
qlmanage命令是管理QuickLook服务的,这条命令的使用输出如下:
qlmanage命令
qlmanage允许您测试Quick Look生成器和管理Quick Look服务器。
#重置Quick Look服务器和所有Quick Look客户端的生成器缓存
qlmanage -r
#获取Quick Look服务器上的所有信息,包括检测到的生成器列表。
qlmanage -m [name...]
#显示为指定文件生成的Quick Look缩略图(如果可用)。
qlmanage -t [-x] [-i] [-s size] [-f factor] [-c contentTypeUTI [-g generator]] [file ...]
#显示Quick Look为指定文件生成的预览。
qlmanage -p [-x] [-c contentTypeUTI [-g generator]] [file ...]
#显示帮助。
qlmanage -h
实际开发中的应用
使用QuickLookUI库中的QLPreviewPannel实现图片预览
/*
图片预览
*/
var previewPanel: QLPreviewPanel!
func didClickPreview(_ imgPath: String) {
self.imgPath = imgPath
if self.previewPanel != nil {
self.previewPanel.updateController()
}else{
self.previewPanel = QLPreviewPanel.shared()
}
self.previewPanel.delegate = self
self.previewPanel.dataSource = self
self.previewPanel.makeKeyAndOrderFront(self)
}
func numberOfPreviewItems(in panel: QLPreviewPanel!) -> Int {
return 1
}
func previewPanel(_ panel: QLPreviewPanel!, previewItemAt index: Int) -> QLPreviewItem! {
if self.imgPath == nil {
self.imgPath = ""
}
let lastPath = (self.imgPath! as NSString).lastPathComponent
let path = GlobelInfo.getInstance().imageCachePath + String(format: "%@",lastPath);
let fileMangaer = FileManager.default
if fileMangaer.fileExists(atPath: "/" + self.imgPath!) {
return URL.init(fileURLWithPath: "/" + self.imgPath!) as QLPreviewItem
}else {
return URL.init(fileURLWithPath: path) as QLPreviewItem
}
}
override func acceptsPreviewPanelControl(_ panel: QLPreviewPanel!) -> Bool {
return true
}
override func beginPreviewPanelControl(_ panel: QLPreviewPanel!) {
panel.delegate = self
panel.dataSource = self
}
override func endPreviewPanelControl(_ panel: QLPreviewPanel!) {
panel.dataSource = nil;
panel.delegate = nil;
}