我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗? [英] Can we extract image from LPLinkView in LinkPresentation framework?
问题描述
我想在我的应用程序中显示一个丰富的链接,并将这些数据发送到我的服务器.我需要访问
遗憾的是,您无法访问 LPLinkView
的任何内部属性,但您可以轻松创建自己的视图.LPLinkMetadata
对象拥有您需要的一切,您只需要知道如何从 iconProvider
和 imageProvider
中提取图像,它们是 <代码>NSItemProvider.
UIKit (iOS)
您可以使用NSItemProvdier
的loadObject(ofClass:)
方法轻松获取UIImage
.这是有效的,因为 UIImage
符合 NSItemProviderReading
协议.
import LinkPresentation导入 UIKit让 imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))让 url = URL(字符串:https://stackoverflow.com/q/61286308/2101447")!LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in守卫 let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }打印(linkMetadata.title ??无标题")imageProvider.loadObject(ofClass: UIImage.self) { (image, error) in守卫错误== nil else {//处理错误返回}如果让图像 = 图像为?用户界面{//对图像做一些事情DispatchQueue.main.async {imageView.image = 图像}} 别的 {打印(没有可用的图像")}}}
SwiftUI
SwiftUI 的Image
是一个struct
,所以它不能符合NSItemProviderReading
.最简单的方法是使用上面的 UIKit 代码获取 UIImage
并从中实例化 SwiftUI Image
.
...如果让 uiImage = loadedImage 为?用户界面{让图像 = 图像(uiImage:uiImage)}
AppKit (macOS)
与其 UIImage
姐妹不同,NSImage
不符合 NSItemProviderReading
,这意味着你必须使用 NSItemProvdier
的旧 loadItem(forTypeIdentifier:options:)
方法.
您需要指定 typeIdentifier
并从 Data
自己初始化 NSImage
,但其他方面几乎相同.>
import CoreServices//可能需要 kUTTypeImage导入链接演示导入应用套件让 imageView = NSImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))让 url = URL(字符串:https://stackoverflow.com/q/61286308/2101447")!LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in守卫 let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }打印(linkMetadata.title ??无标题")imageProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) { (data, error) in守卫错误== nil else {//处理错误返回}守卫让数据=数据作为?其他数据{打印(没有可用的图像")返回}如果让图像 = NSImage(数据:数据){//对图像做一些事情DispatchQueue.main.async {self.imageView.image = 图像}} 别的 {打印(没有可用的图像")}}}
I want to present a rich link in my app and also send those data to my server. I need to access the image inside the view of LPLinkView.
how can I access the parameters inside it? (like: image, description, title, icon, and ext...)
Unfortunately, you can't access any internal properties of an LPLinkView
, but you can easily create your own view. The LPLinkMetadata
object has everything you need, you just need to know how to extract the images from its iconProvider
and imageProvider
, which are subclasses of NSItemProvider
.
UIKit (iOS)
You can use NSItemProvdier
's loadObject(ofClass:)
method to easily get a UIImage
. This works because UIImage
conforms to the NSItemProviderReading
protocol.
import LinkPresentation
import UIKit
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let url = URL(string: "https://stackoverflow.com/q/61286308/2101447")!
LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in
guard let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }
print(linkMetadata.title ?? "Untitled")
imageProvider.loadObject(ofClass: UIImage.self) { (image, error) in
guard error == nil else {
// handle error
return
}
if let image = image as? UIImage {
// do something with image
DispatchQueue.main.async {
imageView.image = image
}
} else {
print("no image available")
}
}
}
SwiftUI
SwiftUI's Image
is a struct
, so it cannot conform to NSItemProviderReading
. It's easiest to use the UIKit code above to obtain a UIImage
and instantiate a SwiftUI Image
from that.
...
if let uiImage = loadedImage as? UIImage {
let image = Image(uiImage: uiImage)
}
AppKit (macOS)
Unlike its UIImage
sister, NSImage
does not conform to NSItemProviderReading
, which means you'll have to use NSItemProvdier
's older loadItem(forTypeIdentifier:options:)
method.
You'll need to specify the typeIdentifier
and initialize the NSImage
from Data
yourself, but otherwise it's pretty much the same.
import CoreServices // may be necessary for kUTTypeImage
import LinkPresentation
import AppKit
let imageView = NSImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
let url = URL(string: "https://stackoverflow.com/q/61286308/2101447")!
LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in
guard let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }
print(linkMetadata.title ?? "Untitled")
imageProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) { (data, error) in
guard error == nil else {
// handle error
return
}
guard let data = data as? Data else {
print("no image available")
return
}
if let image = NSImage(data: data) {
// do something with image
DispatchQueue.main.async {
self.imageView.image = image
}
} else {
print("no image available")
}
}
}
这篇关于我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!