似乎没有调用QLThumbnailProvider扩展名

时间:2018-01-25 20:42:28

标签: ios uidocument

我正在开发一个QLThumbnailProvider扩展来显示我的文档类型的缩略图。我的扩展程序没有显示被调用 - 我的缩略图没有显示,而且我没有看到我添加的日志记录显示在任何日志文件中。

我有一个基于UIDocumentBrowserViewController的应用程序,它定义了一个新的文档类型。它导出一个UTI(com.latenightsw.Eureka.form)。我的应用程序可以浏览,创建和打开文档,但缩略图是空白的。

我已将缩略图扩展目标添加到我的项目中。代码如下所示:

class ThumbnailProvider: QLThumbnailProvider {
    override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) {
        // Third way: Set an image file URL.
        print("provideThumbnail: \(request)")
        handler(QLThumbnailReply(imageFileURL: Bundle.main.url(forResource: "EurekaForm", withExtension: "png")!), nil)

    }
}

我已确认EurekaForm.png是目标的一部分,并被复制到扩展程序包(以及主机应用程序包)。

我已经确认我的UTI被宣布:

Thumbnail Extension PList

有没有人有任何建议?

3 个答案:

答案 0 :(得分:0)

我已经获得了缩略图扩展渲染,但它只在文件应用程序中显示其渲染(其他人使用应用程序图标),据我所知。

请务必注意this issue with debugging extensions,即使扩展程序正在运行,控制台和断点也可能无法调用。

我看到你的UTI设置了QLSupportedContentTypes,但是你可能还想把你的UTI改成新的东西,就像它开始为我工作一样。我认为经过一些测试后,UTI可能会被破坏。虽然它正在工作,但我设置了断点并且从未调用它。

答案 1 :(得分:0)

看来,日志记录和断点有时在应用程序扩展中不起作用。甚至fatalError都是无声的。

在我的项目中,无法启动初始化程序QLThumbnailReply(imageFileURL:)。但是其他初始化程序似乎效果更好。

将图像绘制到上下文中

使用上下文初始化程序时,必须使用介于request.minimumSizerequest.maximumSize之间的上下文大小。

下面,我写了一些代码,在保持上述条件的同时,将图像取到上下文中。

override func provideThumbnail(for request: QLFileThumbnailRequest, _ handler: @escaping (QLThumbnailReply?, Error?) -> Void) {

    let imageURL = // ... put your own code here

    let image = UIImage(contentsOfFile: imageURL.path)!


    // size calculations

    let maximumSize = request.maximumSize
    let imageSize = image.size

    // calculate `newImageSize` and `contextSize` such that the image fits perfectly and respects the constraints
    var newImageSize = maximumSize
    var contextSize = maximumSize
    let aspectRatio = imageSize.height / imageSize.width
    let proposedHeight = aspectRatio * maximumSize.width

    if proposedHeight <= maximumSize.height {
        newImageSize.height = proposedHeight
        contextSize.height = max(proposedHeight.rounded(.down), request.minimumSize.height)
    } else {
        newImageSize.width = maximumSize.height / aspectRatio
        contextSize.width = max(newImageSize.width.rounded(.down), request.minimumSize.width)
    }

    handler(QLThumbnailReply(contextSize: contextSize, currentContextDrawing: { () -> Bool in
        // Draw the thumbnail here.

        // draw the image in the upper left corner
        //image.draw(in: CGRect(origin: .zero, size: newImageSize))

        // draw the image centered
        image.draw(in: CGRect(x: contextSize.width/2 - newImageSize.width/2, 
                              y: contextSize.height/2 - newImageSize.height/2,
                              width: newImageSize.width,
                              height: newImageSize.height);)

        // Return true if the thumbnail was successfully drawn inside this block.
        return true
    }), nil)
}

答案 2 :(得分:0)

就我而言,扩展程序在模拟器(Xcode 11.1)中不起作用。一切都可以在真实设备(iOS 13.1.2)上按预期工作。