使用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来分享的,最近使用官方的UIActivityViewController来做分享,结果分享图片的时候preview不了分享的图片。 自定义一个继承UIActivityItemProvider的类。关于分享的内容自定义可以自己实现UIActivityItemSource这个协议。首先看看协议的…...
linux安装终端连接工具Tabby
参考:https://zhuanlan.zhihu.com/p/645787655...
Linux telnet命令详解:通过TCP/IP网络连接与管理远程机器(附实例教程和注意事项)
Linux telnet命令介绍 telnet命令,全称为teletype network,是一个使用telnet网络协议来连接并管理远程机器的命令。它通过TCP/IP网络使用端口23来建立连接,并提供了一种使用命令行界面(CLI)管理远程系统的方式。虽然t…...
linux 磁盘管理、分区管理常用命令
文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区,以及分区的磁盘使用情况 df [目录] #例如:df /ho…...
Milvus入门手册1.0
一、window环境搭建(单机) 1、docker安装 略 2、milvus安装 参考文档:https://milvus.io/docs/install_standalone-docker.md tips: (1)compose.yaml下载比较慢,可以在网络上找一份。 (2&…...
PCL 计算两点云之间的最小距离
目录 一、 算法原理二、 代码实现三、 结果展示四、 相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、 算法原理 pcl::registration::CorrespondenceEstimation是确定目标和查询点集(或特征)之间对应关…...
基于YOLOv5的视频计数 — 汽车计数实现
在视频中计数对象可能看起来有挑战性,但借助Python和OpenCV的强大功能,变得令人意外地易于实现。在本文中,我们将探讨如何使用YOLO(You Only Look Once)目标检测模型在视频流或文件中计数对象。我们将该过程分解为简单…...
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的使用 一、首页案例修改 修改首页的信息:是在之前介绍的HelloWorld.vue文件中进行内容的修改。 页面展示效果: 此时就看到了我们新添加的文字了! 同样的我们开发代码的时候只需要修改了项目中的内容然后保存就会自动刷新的浏览器&…...
基于M估计样本一致性算法的点云平面拟合
平面拟合 1、算法简介2、参考文献3、实现效果4、相关代码 1、算法简介 RANSAC 是在给定模型和距离阈值 T T T的情况下,通过寻找最小代价 C C C来确定内点数据并拟合模型。如式(1)所示的代价函数,当点到模型的距离 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 起初是一家总部位于纽约的聊天机器人初创服务商,他们本来打算创业做聊天机器人,然后在github上开源了一个Transformers库,虽然聊天机器人业务没搞起来,但是他们的这个库在机器学习社区迅速大火起来。目前已经共享了超…...
pycharm 怎么切换Anaconda简单粗暴
(1)创建一个环境 (2)选择一下自己conda的安装路径中conba.exe (3)选择存在的环境,一般会自动检测到conda创建有哪些环境,导入就行...
笔记二十二、使用路由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结です ここは总 • 结です 我也不知道要写些什么,就随便写了 csp/s第一题10min出ac思路,结果写炸了qwq,被旁边的大哥影响稍微有点大,没调完第一题…...
ESP32-Web-Server编程-HTML 基础
ESP32-Web-Server编程-HTML 基础 概述 HTML(HyperText Markup Language) 是用来描述网页的一种语言。其相关内容存储在前端代码的 .html 文件中。 当浏览器向 web 服务器请求网页时,一个 HTML 文件被发送给浏览器,浏览器解释该文件的内容,…...
【docker】docker安装与优化
目录 一、安装Docker 1、关闭防火墙 2、安装依赖包 3、设置阿里云镜像源 4、安装Docker-CE社区版并设置为开机自启动 5、查看Docker信息 二、设置镜像加速 1、申请加速地址 2、实现加速操作 三、网络优化 1、如何网络优化 2、具体操作 四、docker-server端配置文件…...
https到底把什么加密了?
首先直接说结论, https安全通信模式,是使用TLS加密传输所有的http协议。再重复一遍,是所有! 通常将TLS加密传输http这个通信过程称为https,如果使用协议封装的逻辑结构来表达就是: IP TCP TLS 【 HTTP 】…...
python爬虫防乱码方案
python爬虫防乱码方案 一、chardet库 自动检测编码:使用 Python 库 chardet 可以自动检测文本的编码,然后使用检测到的编码来解码文本。你可以尝试使用 chardet 库来检测编码,然后解码网页内容。 案例 import requests import chardet…...
Java 语言的入门级教程有哪些?
1、Java SE 1.1、Java基础 基础概念/语法:面向对象(继承、封装、多态)基础、包、类、接口、方法、对象、属性、第一个 Java 程序。 数据类型: 1)基本数据类型8种:byte、short、int、long、float、doubl…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
