使用较小的 UIImage 为 UIActivityViewController 设置缩略图

Che*_*kie 5 sharing thumbnails uiimage uiactivityviewcontroller swift

我想设置一个特定的较小缩略图,但仍为我正在共享的活动项目使用高质量图像。我的问题是在共享大图像时,缩略图需要时间来生成,这在将其共享给某些应用程序时可能会导致问题。

例如,如果我展示我的 UIActivity 控制器,并选择 Messenger,

在此处输入图片说明

我没有时间让我的缩略图加载,选择一个人并点击发送,它永远不会完成发送,我需要取消。

在此处输入图片说明

只有当我等待缩略图生成,然后点击发送,一切才会正常。

在此处输入图片说明

在这种情况下,“照片”是高质量的 UIImage,但是如何设置缩略图以避免在 UIActivityViewController 出现时从高质量图像中生成一张呢?

let activity = UIActivityViewController(activityItems: [photo], applicationActivities: nil)

UIApplication.topViewController?.present(activity, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

有一个关于缩略图的文档,但我不确定如何实现它,或者在这种情况下它是否有帮助:https : //developer.apple.com/documentation/uikit/uiactivityitemsource/1620462-activityviewcontroller

另外,我阅读了 UIActivityItemProvider,它指出:

例如,您可以使用 provider 对象来表示需要处理的大型视频文件,然后才能将其共享到用户的社交媒体帐户。

这是否意味着它可以推迟显示我想与之共享图像的应用程序,直到它准备好?我继承了 UIActivityItemProvider,并传递了一个缩略图,但它似乎没有任何效果。我要么做错了什么,要么这不是我想要使用的。

我的子类 UIActivityItemProvider:

class CustomProvider : UIActivityItemProvider {

    var image : UIImage!

    init(placeholderItem: AnyObject, image : UIImage) {
        super.init(placeholderItem: placeholderItem)
        self.image = image
    }

    override var item: Any {
        return self.image!
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个共享功能,它是一个扩展。我创建了一个缩略图图像并将其传递给 CustomProvider 函数中的 placeholderItem:

extension Equatable {
    func share() {

        let imageData = (self as! UIImage).pngData()!
        let options = [
            kCGImageSourceCreateThumbnailWithTransform: true,
            kCGImageSourceCreateThumbnailFromImageAlways: true,
            kCGImageSourceThumbnailMaxPixelSize: 300] as CFDictionary
        let source = CGImageSourceCreateWithData(imageData as CFData, nil)!
        let imageReference = CGImageSourceCreateThumbnailAtIndex(source, 0, options)!
        let thumbnail = UIImage(cgImage: imageReference)


        let firstActivityItem = CustomProvider(placeholderItem: thumbnail, image: self as! UIImage)

        let activity = UIActivityViewController(activityItems: [firstActivityItem], applicationActivities: nil)

        UIApplication.topViewController?.present(activity, animated: true, completion: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

jms*_*jms -1

You could generate a low quality image in your application and reference that url in the UIActivityViewController

let activity = UIActivityViewController(
activityItems: ["Some description", url],
applicationActivities: nil)
Run Code Online (Sandbox Code Playgroud)

You may use the following to generate a low quality image which can be locally saved later:

NSData * UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality);
Run Code Online (Sandbox Code Playgroud)

...或参考以下帖子了解更多技术知识和方法: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

学分。从以下位置提取的材料: