我正在开发一个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被宣布:
有没有人有任何建议?
答案 0 :(得分:0)
我已经获得了缩略图扩展渲染,但它只在文件应用程序中显示其渲染(其他人使用应用程序图标),据我所知。
请务必注意this issue with debugging extensions,即使扩展程序正在运行,控制台和断点也可能无法调用。
我看到你的UTI设置了QLSupportedContentTypes,但是你可能还想把你的UTI改成新的东西,就像它开始为我工作一样。我认为经过一些测试后,UTI可能会被破坏。虽然它正在工作,但我设置了断点并且从未调用它。
答案 1 :(得分:0)
看来,日志记录和断点有时在应用程序扩展中不起作用。甚至fatalError
都是无声的。
在我的项目中,无法启动初始化程序QLThumbnailReply(imageFileURL:)
。但是其他初始化程序似乎效果更好。
使用上下文初始化程序时,必须使用介于request.minimumSize
和request.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)上按预期工作。