我目前正在构建一个接受 URL 的共享扩展。作为其中的一部分,我按照上一个问题中的概述自定义了我的共享屏幕,以创建一个全屏 View Controller 。这一切都很好。但是在默认的共享 Composer View 中,我注意到有一个网页的预览图像。我试图在我的扩展程序中访问它,但我似乎无法掌握它。
具体我一直在尝试使用方法
loadPreviewImage
https://developer.apple.com/reference/foundation/nsitemprovider/1403925-loadpreviewimage
您会在文档中注意到,这为完成处理程序说明了以下内容
completionHandler A completion handler block to execute with the results. The first parameter of this block must be a parameter of type NSData, NSURL, UIImage (in iOS), or NSImage (in macOS) for receiving the image data. For more information about implementing the block, see CompletionHandler.
但是,如果我尝试在我的完成 block 中将其设置为 UIImage,则会收到错误
Cannot convert value of type '(UIImage, _) -> ()' to expected argument type 'NSItemProvider.CompletionHandler!'
通过 guard 语句确认 itemProvider 是 NSItemProvider 实例的示例代码
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in
}
完成处理程序的文档说将其设置为您想要的类型,它会尝试将数据强制转换为您指定的类型。有没有人见过这个?我不确定在这里做什么,因为我看不到我做错了什么。
https://developer.apple.com/reference/foundation/nsitemprovider/completionhandler
如果一切都失败了,我会考虑使用一些 Javascript 从 dom 中获取图像,但我更喜欢 Apple 似乎提供的预览图像
最佳答案
不知道为什么里面的代码
itemProvider.loadPreviewImage(options: nil) { (image: UIImage, error) in
}
点击发布按钮时不调用。
我的方法是在方法中保存预览图像
override func configurationItems() -> [Any]! {
}
作为
let inputItem: NSExtensionItem = self.extensionContext?.inputItems[0] as! NSExtensionItem
let itemProvider = inputItem.attachments![0] as! NSItemProvider
if (itemProvider.hasItemConformingToTypeIdentifier("public.url")) {
itemProvider.loadPreviewImage(options: nil, completionHandler: { (item, error) in // 画像を取得する
if let image = item as? UIImage {
if let data = UIImagePNGRepresentation(image) {
self.photoNSURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("preview.png") as NSURL!
do {
try data.write(to: self.photoNSURL as URL, options: .atomic)
} catch {
print("\(#file)#\(#function)(\(#line)): error: \(error.localizedDescription)")
}
}
}
})
}
关于iOS - Swift 3 共享扩展预览图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173281/