我们可以从LinkPresentation框架的LPLinkView中提取图像吗?

问题描述 投票:1回答:1

我想在我的应用程序中显示一个丰富的链接,并将这些数据发送到我的服务器。我需要访问LPLinkView视图内的图像。

我如何访问其中的参数? (例如:图片,说明,标题,图标和扩展名...)

LPLinkView of URL swift

swift xcode web-crawler api-linkpreview
1个回答
0
投票

[遗憾的是,您无法访问LPLinkView的任何内部属性,但可以轻松创建自己的视图。 LPLinkMetadata对象具有您所需的一切,您只需要知道如何从iconProviderimageProvider(它们是NSItemProvider的子类)中提取图像即可。

UIKit(iOS)

您可以使用NSItemProvdierloadObject(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

SwiftUI的Imagestruct,因此它不符合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://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")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.