我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗? [英] Can we extract image from LPLinkView in LinkPresentation framework?

查看:37
本文介绍了我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

解决方案

遗憾的是,您无法访问 LPLinkView 的任何内部属性,但您可以轻松创建自己的视图.LPLinkMetadata 对象拥有您需要的一切,您只需要知道如何从 iconProviderimageProvider 中提取图像,它们是 <代码>NSItemProvider.

UIKit (iOS)

您可以使用NSItemProvdierloadObject(ofClass:) 方法轻松获取UIImage.这是有效的,因为 UIImage 符合 NSItemProviderReading 协议.

import LinkPresentation导入 UIKit让 imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))让 url = URL(字符串:https://stackoverflow.com/q/61286308/2101447")!LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in守卫 let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }打印(linkMetadata.title ??无标题")imageProvider.loadObject(ofClass: UIImage.self) { (image, error) in守卫错误== nil else {//处理错误返回}如果让图像 = 图像为?用户界面{//对图像做一些事情DispatchQueue.main.async {imageView.image = 图像}} 别的 {打印(没有可用的图像")}}}

SwiftUI

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

...如果让 uiImage = loadedImage 为?用户界面{让图像 = 图像(uiImage:uiImage)}

AppKit (macOS)

与其 UIImage 姐妹不同,NSImage 不符合 NSItemProviderReading,这意味着你必须使用 NSItemProvdier 的旧 loadItem(forTypeIdentifier:options:) 方法.

您需要指定 typeIdentifier 并从 Data 自己初始化 NSImage,但其他方面几乎相同.>

import CoreServices//可能需要 kUTTypeImage导入链接演示导入应用套件让 imageView = NSImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))让 url = URL(字符串:https://stackoverflow.com/q/61286308/2101447")!LPMetadataProvider().startFetchingMetadata(for: url) { (linkMetadata, error) in守卫 let linkMetadata = linkMetadata, let imageProvider = linkMetadata.iconProvider else { return }打印(linkMetadata.title ??无标题")imageProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil) { (data, error) in守卫错误== nil else {//处理错误返回}守卫让数据=数据作为?其他数据{打印(没有可用的图像")返回}如果让图像 = NSImage(数据:数据){//对图像做一些事情DispatchQueue.main.async {self.imageView.image = 图像}} 别的 {打印(没有可用的图像")}}}

I want to present a rich link in my app and also send those data to my server. I need to access the image inside the view of LPLinkView.

how can I access the parameters inside it? (like: image, description, title, icon, and ext...)

解决方案

Unfortunately, you can't access any internal properties of an LPLinkView, but you can easily create your own view. The LPLinkMetadata object has everything you need, you just need to know how to extract the images from its iconProvider and imageProvider, which are subclasses of NSItemProvider.

UIKit (iOS)

You can use NSItemProvdier's loadObject(ofClass:) method to easily get a UIImage. This works because UIImage conforms to the NSItemProviderReading protocol.

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's Image is a struct, so it cannot conform to NSItemProviderReading. It's easiest to use the UIKit code above to obtain a UIImage and instantiate a SwiftUI Image from that.

...

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

AppKit (macOS)

Unlike its UIImage sister, NSImage does not conform to NSItemProviderReading, which means you'll have to use NSItemProvdier's older loadItem(forTypeIdentifier:options:) method.

You'll need to specify the typeIdentifier and initialize the NSImage from Data yourself, but otherwise it's pretty much the same.

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")
        }
    }
}

这篇关于我们可以从 LinkPresentation 框架中的 LPLinkView 中提取图像吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆