我想在我的应用程序中显示一个丰富的链接,并将这些数据发送到我的服务器。我需要访问LPLinkView视图内的图像。
如何访问其中的参数?(例如:图像、描述、标题、图标和扩展...)
不幸的是,您无法访问 的任何内部属性LPLinkView
,但您可以轻松创建自己的视图。该LPLinkMetadata
对象具有您需要的一切,您只需要知道如何从它的iconProvider
和中提取图像imageProvider
,它们是NSItemProvider
.
您可以使用NSItemProvdier
'loadObject(ofClass:)
方法轻松获取UIImage
. 这是有效的,因为UIImage
符合NSItemProviderReading
协议。
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")
}
}
}
SwiftUIImage
是一个struct
,所以它不能符合NSItemProviderReading
. 使用上面的 UIKit 代码来获取UIImage
并实例化 SwiftUI是最简单的Image
。
...
if let uiImage = loadedImage as? UIImage {
let image = Image(uiImage: uiImage)
}
不像它的UIImage
姐妹,NSImage
不符合NSItemProviderReading
,这意味着你必须使用NSItemProvdier
旧的loadItem(forTypeIdentifier:options:)
方法。
您需要自己指定typeIdentifier
并初始化NSImage
,Data
但除此之外几乎相同。
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")
}
}
}