Можем ли мы извлечь изображение из LPLinkView в структуре LinkPresentation?
Я хочу предоставить расширенную ссылку в своем приложении, а также отправить эти данные на свой сервер. Мне нужно получить доступ к изображению в представлении LPLinkView.
как я могу получить доступ к параметрам внутри него? (например: изображение, описание, заголовок, значок и доп...)
1 ответ
К сожалению, вы не можете получить доступ к каким-либо внутренним свойствам LPLinkView
, но вы можете легко создать свой собственный вид. ВLPLinkMetadata
объект имеет все необходимое, вам просто нужно знать, как извлекать изображения из его iconProvider
а также imageProvider
, которые являются подклассами NSItemProvider
.
UIKit (iOS)
Ты можешь использовать 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://stackru.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 Image
это struct
, поэтому он не может соответствовать NSItemProviderReading
. Проще всего использовать приведенный выше код UIKit, чтобы получитьUIImage
и создать экземпляр SwiftUI Image
От этого.
...
if let uiImage = loadedImage as? UIImage {
let image = Image(uiImage: uiImage)
}
AppKit (macOS)
В отличие от своего 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://stackru.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")
}
}
}