使用 Finder 预览中的图标显示的文件的 NSCollectionView 网格

NSCollectionView Grid of Files Displayed with Icons from Finder's Preview

我在尝试使用取自 Finder 图标预览的图标创建 NSCollectionView 时遇到问题。

理想情况下,如果文件是 dmg,它应该显示硬盘驱动器图标,mp3 应该是 mp3 图标,照片应该显示照片本身的样子。

有一个 post 解决了这个问题: Is it possible to get programmatic access to finder preview images?

但是代码很旧,无法编译。我也在这个项目中使用Swift。

我用这个 post 为我的项目设置模板:

它向 NSView 添加了一个子视图。如果能修改成图标就完美了。

此外,我正在使用 NSFileManager.defaultManager 获取文件夹的内容,并希望在集合视图中显示这些内容。

我是 Mac 平台开发的新手,对 iOS 有更多的经验,非常感谢具体的回答,谢谢!

更新,我能够弄清楚如何将 Finder 与 Apple 提供的 Quicklook 库一起使用。这是我使用的代码的一部分。请注意,如果您尝试在没有预览的文件上使用 Quicklook,则会出现错误,因此在这些情况下,我只是使用了 iconForFile 函数(在此代码块下方)

let tmp = QLThumbnailImageCreate(kCFAllocatorDefault, tmpURL , CGSize(width: 64, height: 64), nil)
tmpImage = tmp.takeUnretainedValue()
tmpIcon = NSImage(CGImage: tmpImage!, size: NSSize(width: 64, height: 64))

原文:

我能够(几乎)找到我要找的东西。

NSWorkspace中class有一个方法

func iconForFile(_ fullPath: String) -> NSImage

这将 return 一个 NSImage 图标。不幸的是,如果是图片,我看不到预览图像的方法。我也没有看到使图片变大的方法(只有 32x32 像素)。

希望这个回答能帮助遇到这个问题的其他人!

我使用了您回答中的代码,但我注意到它没有保持文件的纵横比,低分辨率版本只是下采样的高分辨率版本。因此,根据您的回答,这是我的解决方案:

let imageLowResRef = QLThumbnailImageCreate(kCFAllocatorDefault, url as CFURL , CGSize(width: 32, height: 32), nil)

guard imageLowResRef != nil else {
    return NSWorkspace.shared.icon(forFile: url.path)
}

let image = NSImage()
let imageLowRes = imageLowResRef!.takeUnretainedValue()
image.addRepresentation(NSBitmapImageRep(cgImage: imageLowRes))

let imageHighResRef = QLThumbnailImageCreate(kCFAllocatorDefault, url as CFURL , CGSize(width: imageLowRes.width*2, height: imageLowRes.height*2), nil)
let imageHighRes = imageHighResRef!.takeUnretainedValue()
image.addRepresentation(NSBitmapImageRep(cgImage: imageHighRes))

编辑: 如果你添加 let options = [kQLThumbnailOptionIconModeKey: true] as CFDictionary,你会得到选项参数,你会得到呈现为图标的预览。