【发布时间】:2020-12-21 02:49:22
【问题描述】:
【问题讨论】:
标签: swift xcode web-crawler api-linkpreview
【问题讨论】:
标签: swift xcode web-crawler api-linkpreview
很遗憾,您无法访问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")
}
}
}
SwiftUI 的Image 是一个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 并从Data 初始化NSImage,但除此之外几乎相同。
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")
}
}
}
【讨论】:
DispatchQueue闭包中将self.放在imageView之前