【问题标题】:NSCollectionView Grid of Files Displayed with Icons from Finder's PreviewNSCollectionView 文件的网格显示与 Finder 预览中的图标
【发布时间】:2016-05-26 20:07:16
【问题描述】:

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

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

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

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

我使用这篇文章为我的项目设置了一个模板: Is there a way to set up a NSCollectionView programmatically in Swift?

向 NSView 添加一个子视图。如果这可以修改以实现图标,那将是理想的。

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

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

【问题讨论】:

    标签: swift cocoa nscollectionview


    【解决方案1】:

    更新,我能够弄清楚如何将 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 类中有一个方法

    func iconForFile(_ fullPath: String) -> NSImage
    

    这将返回图标的 NSImage。不幸的是,如果它是图片,我看不到获得图像预览的方法。我也看不到让图片变大的方法(只有 32x32 像素)。

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

    【讨论】:

      【解决方案2】:

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

      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,你会得到options参数,你会得到呈现为图标的预览。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-25
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2016-05-30
        • 1970-01-01
        相关资源
        最近更新 更多