当前位置: 首页 > news >正文

使用UIActivityViewController分享图片,没有preview

以前都是用第三方sdk来分享的,最近使用官方的UIActivityViewController来做分享,结果分享图片的时候preview不了分享的图片。
自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的订阅,当我看到有一个返回thumbimage的接口时候,第一感觉就是它是我需要的。

@protocol UIActivityItemSource <NSObject>@required- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController;	// called to determine data type. only the class of the return type is consulted. it should match what -itemForActivityType: returns later
- (nullable id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(nullable UIActivityType)activityType;	// called to fetch data after an activity is selected. you can return nil.@optional- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(nullable UIActivityType)activityType; // if activity supports a Subject field. iOS 7.0
- (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(nullable UIActivityType)activityType; // UTI for item if it is an NSData. iOS 7.0. will be called with nil activity and then selected activity
- (nullable UIImage *)activityViewController:(UIActivityViewController *)activityViewController thumbnailImageForActivityType:(nullable UIActivityType)activityType suggestedSize:(CGSize)size; // if activity supports preview image. iOS 7.0
- (nullable LPLinkMetadata *)activityViewControllerLinkMetadata:(UIActivityViewController *)activityViewController API_AVAILABLE(ios(13.0)); // called to fetch LinkPresentation metadata for the activity item. iOS 13.0@end

结果测试发现,这个方法再iOS17上根本不触发,应该是iOS13以前就用上面几个,iOS13后就用LPLinkMetadata的方法。LPLinkMetadata中有一个imageProvider,他就是preview的内容。

 public func activityViewControllerLinkMetadata(_ activityViewController: UIActivityViewController) -> LPLinkMetadata? {let metadata = LPLinkMetadata()metadata.title = "My title" // Preview Titlemetadata.originalURL = URL(string: "You sub title here") // Set image metadata.imageProvider = NSItemProvider(object: image)return metadata
}

感觉完成了,但是测试的时候有发现问题了,preview没有铺满那个区域。搜索了一下,发现是图片有alpha透明的区域。对应的处理方法就是去掉透明区域。

extension UIImage {func adjustedForShareSheetPreviewIconProvider() -> UIImage {let replaceTransparencyWithColor = UIColor.black // change as requiredlet minimumSize: CGFloat = 40.0  // pointslet format = UIGraphicsImageRendererFormat.init()format.opaque = trueformat.scale = self.scalelet imageWidth = self.size.widthlet imageHeight = self.size.heightlet imageSmallestDimension = max(imageWidth, imageHeight)let deviceScale = UIScreen.main.scalelet resizeFactor = minimumSize * deviceScale  / (imageSmallestDimension * self.scale)let size = resizeFactor > 1.0? CGSize(width: imageWidth * resizeFactor, height: imageHeight * resizeFactor): self.sizereturn UIGraphicsImageRenderer(size: size, format: format).image { context inlet size = context.format.bounds.sizereplaceTransparencyWithColor.setFill()context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))self.draw(in: CGRect(origin: .zero, size: size))}}
}

如果不想处理图片大小的就直接去掉alpha通道

func removingAlpha() -> UIImage {let format = UIGraphicsImageRendererFormat()format.opaque = true // removes Alpha Channelformat.scale = scale // keeps original image scalereturn UIGraphicsImageRenderer(size: size, format: format).image { _ inlet size = context.format.bounds.sizeUIColor.whiteColor.setFill()context.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))draw(in: CGRect(origin: .zero, size: size))}}

这下就正常了。

Referene:
https://stackoverflow.com/questions/57850483/ios13-share-sheet-how-to-set-preview-thumbnail-when-sharing-uiimage
https://nemecek.be/blog/189/wip-sharing-data-with-uiactivityviewcontroller-tips-tricks

相关文章:

使用UIActivityViewController分享图片,没有preview

以前都是用第三方sdk来分享的&#xff0c;最近使用官方的UIActivityViewController来做分享&#xff0c;结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...

linux安装终端连接工具Tabby

参考&#xff1a;https://zhuanlan.zhihu.com/p/645787655...

Linux telnet命令详解:通过TCP/IP网络连接与管理远程机器(附实例教程和注意事项)

Linux telnet命令介绍 telnet命令&#xff0c;全称为teletype network&#xff0c;是一个使用telnet网络协议来连接并管理远程机器的命令。它通过TCP/IP网络使用端口23来建立连接&#xff0c;并提供了一种使用命令行界面&#xff08;CLI&#xff09;管理远程系统的方式。虽然t…...

linux 磁盘管理、分区管理常用命令

文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区&#xff0c;以及分区的磁盘使用情况 df [目录] #例如&#xff1a;df /ho…...

Milvus入门手册1.0

一、window环境搭建&#xff08;单机&#xff09; 1、docker安装 略 2、milvus安装 参考文档&#xff1a;https://milvus.io/docs/install_standalone-docker.md tips: &#xff08;1&#xff09;compose.yaml下载比较慢&#xff0c;可以在网络上找一份。 &#xff08;2&…...

PCL 计算两点云之间的最小距离

目录 一、 算法原理二、 代码实现三、 结果展示四、 相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 pcl::registration::CorrespondenceEstimation是确定目标和查询点集(或特征)之间对应关…...

基于YOLOv5的视频计数 — 汽车计数实现

在视频中计数对象可能看起来有挑战性&#xff0c;但借助Python和OpenCV的强大功能&#xff0c;变得令人意外地易于实现。在本文中&#xff0c;我们将探讨如何使用YOLO&#xff08;You Only Look Once&#xff09;目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...

jetson nano 串口通信

目录 1.UART通信介绍 2.电脑端准备工作 2.1 安装串口调试助手 2.2 硬件接线 3.Jetson Nano端准备工作 3.1安装库文件 3.2修改主板上电启动串口权限 4.示例程序-发送及接收 4.1 开启串口调试助手 4.2 导入示例程序 4.3 执行程序 4.4 查看效果 4.4.1 串口调试端 4.4…...

Vue基础入门(三):Vue3的使用

Vue3的使用 一、首页案例修改 修改首页的信息&#xff1a;是在之前介绍的HelloWorld.vue文件中进行内容的修改。 页面展示效果&#xff1a; 此时就看到了我们新添加的文字了&#xff01; 同样的我们开发代码的时候只需要修改了项目中的内容然后保存就会自动刷新的浏览器&…...

基于M估计样本一致性算法的点云平面拟合

平面拟合 1、算法简介2、参考文献3、实现效果4、相关代码 1、算法简介 RANSAC 是在给定模型和距离阈值 T T T的情况下&#xff0c;通过寻找最小代价 C C C来确定内点数据并拟合模型。如式&#xff08;1&#xff09;所示的代价函数&#xff0c;当点到模型的距离 e e e小于阈值 T…...

【VRTK】【VR开发】【Unity】8-可交互对象

课程配套学习资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【概述】 之前我们只是用了一个简单方块作为可交互对象。其实可交互对象可以有许多细节设置,包括具体抓握物体的哪个点,指定抓握的方向,指定Secondary Acti…...

Huggingface 超详细介绍

Hugging face 起初是一家总部位于纽约的聊天机器人初创服务商&#xff0c;他们本来打算创业做聊天机器人&#xff0c;然后在github上开源了一个Transformers库&#xff0c;虽然聊天机器人业务没搞起来&#xff0c;但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…...

pycharm 怎么切换Anaconda简单粗暴

&#xff08;1&#xff09;创建一个环境 &#xff08;2&#xff09;选择一下自己conda的安装路径中conba.exe (3)选择存在的环境&#xff0c;一般会自动检测到conda创建有哪些环境&#xff0c;导入就行...

笔记二十二、使用路由state进行传递参数

22.1 父组件设置state路由参数 <NavLink toclassify state{{param_C: this.state.name, param_D: this.state.age}} className{this.activeStyle}>classify</NavLink> 父组件 Home/index.jsx import React from "react"; import {NavLink, Outlet} from…...

2023 OI 总结

2023 O I 2023 \space OI 2023 OI ここは总 • 结です ここは总\space• \space结です ここは总 • 结です 我也不知道要写些什么&#xff0c;就随便写了 csp/s第一题10min出ac思路&#xff0c;结果写炸了qwq&#xff0c;被旁边的大哥影响稍微有点大&#xff0c;没调完第一题…...

ESP32-Web-Server编程-HTML 基础

ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时&#xff0c;一个 HTML 文件被发送给浏览器&#xff0c;浏览器解释该文件的内容&#xff0c;…...

【docker】docker安装与优化

目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…...

https到底把什么加密了?

首先直接说结论&#xff0c; https安全通信模式&#xff0c;是使用TLS加密传输所有的http协议。再重复一遍&#xff0c;是所有&#xff01; 通常将TLS加密传输http这个通信过程称为https&#xff0c;如果使用协议封装的逻辑结构来表达就是&#xff1a; IP TCP TLS 【 HTTP 】…...

python爬虫防乱码方案

python爬虫防乱码方案 一、chardet库 ​ 自动检测编码&#xff1a;使用 Python 库 chardet 可以自动检测文本的编码&#xff0c;然后使用检测到的编码来解码文本。你可以尝试使用 chardet 库来检测编码&#xff0c;然后解码网页内容。 案例 import requests import chardet…...

Java 语言的入门级教程有哪些?

1、Java SE 1.1、Java基础 基础概念/语法&#xff1a;面向对象&#xff08;继承、封装、多态&#xff09;基础、包、类、接口、方法、对象、属性、第一个 Java 程序。 数据类型&#xff1a; 1&#xff09;基本数据类型8种&#xff1a;byte、short、int、long、float、doubl…...

AI Agent开发为什么这么火:供需关系深度剖析

“钱景”是肯定有的&#xff0c;重点是怎么拿到offer。现在这行正处于爆发期&#xff0c;月薪3-4w很常见&#xff0c;搞得好年薪80万往上都有可能&#xff0c;大量高薪酬待遇岗都在招&#xff0c;我们这种中小厂都能给到40w税后。 不用太纠结学历&#xff0c;AI Agent是最近一两…...

Git Submodule 深度避坑指南

如果你曾被 submodule 折磨过&#xff0c;这篇文章就是为你准备的。 一、理解 Submodule 的基本概念 什么是 Submodule&#xff1f; Submodule&#xff08;子模块&#xff09;是 Git 提供的一种嵌套仓库管理机制。你可以在一个 Git 仓库中嵌入另一个独立的 Git 仓库&#xff…...

Wireshark的抓包和分析,从零基础到精通,收藏这篇就够了!

各位网络安全的小伙伴们&#xff0c;还在对着枯燥的课本和晦涩的官方文档头疼吗&#xff1f;今天&#xff0c;就让我这位在网络安全圈摸爬滚打多年的老司机&#xff0c;带你玩转Wireshark&#xff0c;保证你看完这篇&#xff0c;抓包分析技能直接起飞&#xff01; Wireshark&am…...

长芯微LPA206完全P2P替代PGA206,是数字可编程增益仪表放大器

描述LPA206是数字可编程增益仪表放大器&#xff0c;非常适合数据采集系统。LPA206的快速稳定时间允许多路复用输入信道&#xff0c;从而提高系统效率。FET输入消除了模拟多路复用器串联电阻引起的IB误差。增益由两条CMOS/TTL兼容地址线选择。即使在电源关闭的情况下&#xff0c…...

Rust async trait 实现分析

Rust async trait 实现分析 Rust作为一门现代系统编程语言&#xff0c;凭借其内存安全和高性能特性广受开发者青睐。异步编程在Rust中的实现一直是一个复杂且充满挑战的领域&#xff0c;尤其是async trait的实现。本文将深入分析Rust中async trait的实现机制&#xff0c;帮助开…...

Spring_couplet_generation 开发环境搭建:IntelliJ IDEA高效开发配置

Spring_couplet_generation 开发环境搭建&#xff1a;IntelliJ IDEA高效开发配置 如果你正在用IntelliJ IDEA做Python开发&#xff0c;特别是想跑通像Spring_couplet_generation这样的AI项目&#xff0c;可能会觉得配置起来有点麻烦。项目依赖多&#xff0c;环境复杂&#xff…...

基于RVC模型的实时合唱系统:单人模拟多人合唱效果

基于RVC模型的实时合唱系统&#xff1a;单人模拟多人合唱效果 你有没有想过&#xff0c;一个人也能唱出气势磅礴的合唱效果&#xff1f;以前这可能需要一个录音棚和一群专业歌手&#xff0c;但现在&#xff0c;借助AI技术&#xff0c;一个人、一台电脑就能轻松实现。今天要聊的…...

零门槛体验:VoxCPM-1.5-WEBUI三步部署教程,快速上手语音合成

零门槛体验&#xff1a;VoxCPM-1.5-WEBUI三步部署教程&#xff0c;快速上手语音合成 1. 为什么选择VoxCPM-1.5-WEBUI&#xff1f; 在当今内容创作爆炸的时代&#xff0c;语音合成技术正变得越来越重要。无论是制作短视频配音、有声读物&#xff0c;还是开发智能客服系统&…...

genanki性能优化指南:如何高效处理大规模卡片生成

genanki性能优化指南&#xff1a;如何高效处理大规模卡片生成 【免费下载链接】genanki A Python 3 library for generating Anki decks 项目地址: https://gitcode.com/gh_mirrors/ge/genanki genanki是一款强大的Python 3库&#xff0c;专为生成Anki卡片而设计。当处理…...

基于OFA模型的智能客服系统开发实战:Python实现视觉问答

基于OFA模型的智能客服系统开发实战&#xff1a;Python实现视觉问答 1. 引言 想象一下这样的场景&#xff1a;一位用户在电商平台上传了一张商品图片&#xff0c;询问"这个产品的材质是什么&#xff1f;"或者"这个尺寸适合多大年龄的孩子&#xff1f;"。…...