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

2024-05-20

我想在我的应用程序中呈现丰富的链接,并将这些数据发送到我的服务器。 我需要访问视图内的图像LPLinkView https://developer.apple.com/documentation/linkpresentation/lplinkview.

我如何访问其中的参数? (例如:图像、描述、标题、图标和扩展名...)


不幸的是,您无法访问任何内部属性LPLinkView,但您可以轻松创建自己的视图。这LPLinkMetadata对象拥有您需要的一切,您只需要知道如何从其中提取图像iconProvider and imageProvider,它们是NSItemProvider.

UIKit(iOS)

您可以使用NSItemProvdier's 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

SwiftUI 的Image is a struct,所以它不能符合NSItemProviderReading。最简单的方法是使用上面的 UIKit 代码来获取UIImage并实例化一个 SwiftUIImage从那。

...

if let uiImage = loadedImage as? UIImage {
    let image = Image(uiImage: uiImage)
}

应用套件 (macOS)

不同于它的UIImage姐姐,NSImage不符合NSItemProviderReading,这意味着你必须使用NSItemProvdier年纪大了loadItem(forTypeIdentifier:options:) method.

您需要指定typeIdentifier并初始化NSImage from 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")
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐