Можем ли мы извлечь изображение из 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")
        }
    }
}
Другие вопросы по тегам