iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

iOS 14,基于 AVPictureInPictureController,实现自定义画中画,涵盖所有功能与难点。

市面上的各种悬浮钟和提词器的原理都是基于此。

Demo源码在文末。

使用 iOS 画中画的要求:

  1. 真机,不能使用模拟器;
  2. iOS 14 及以上;
  3. 开启后台模式:

技术点:​​​​​​​

  1. 添加任意 view 到画中画窗口;
  2. 按需隐藏系统的快进快退按钮、播放按钮、进度条;
  3. 用代码动态修改画中画窗口的形状,横向、竖向 or 方形;
  4. 用代码旋转画中画窗口;
  5. 基于常驻线程的线程保活措施,让你的画中画永不停歇;
  6. 拍照和录视频不会中断画中画;
  7. 拍摄视频画中画的 timer 也不会停止;
  8. 高精度 timer;
  9. 用代码控制进入后台自动开启画中画;
  10. 如何应对苹果的审核。

演示视频:

核心功能:

1. 如何添加自定义 view 到画中画窗口?​​​​​​​

func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController) {// note this is first windowif let window = UIApplication.shared.windows.first {window.addSubview(customView)// use autoLayoutcustomView.snp.makeConstraints { (make) -> Void inmake.edges.equalToSuperview()}}
}

2. 如何隐藏系统的快进快退按钮、播放按钮、进度条?

pipController.setValue(1, forKey: "controlsStyle")

3. 如何用代码动态修改窗口的形状?

窗口的形状由视频的形状决定。

4. 如何用代码旋转窗口?

详见demo源码。

5. 如何在录视频时不暗屏?

详见demo源码。

6. 如何让画中画在后台一直运行?

播放无声音频。

7. 如何进入后台时自动开启画中画?

AVPictuerInPictureController 提供了一个属性:

if #available(iOS 14.2, *) {pipController.canStartPictureInPictureAutomaticallyFromInline = true
} else {// Fallback on earlier versions
}

注:播放器必须处于播放状态。

8. 如何监听画中画窗口变大变小?

KVO,监听画中画里view大小的变化;或者直接在 layoutSubviews 方法里处理。

9. 如何在画中画开启时,让 app 自动进入后台?

调用下面方法:

UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)

10. 如何提升悬浮秒表的精度?

使用 GCD Timer。

最后,如何应对苹果的审核?

苹果可能会因为你使用了后台权限而拒绝你。

可能是因为它没看到你使用了画中画功能,录屏告诉它你使用了画中画,画中画必须依赖 Background Mode.

如果这样还不行,在你的 App 里添加视频播放功能,顺带开启视频播放器的画中画功能,有了能开启画中画的视频播放器,你就可以理所当然的使用 Background Mode 了。

如何快速添加视频播放功能?用 iOS 自带的视频播放器 class 啊。

也可以用一个 web,在 web 里放视频播放器。

视频播放器放什么?实在不知道放什么就放你们产品的画中画使用教程吧。

引申出的骚操作:如何给让 App 可以一直在后台运行?

  • 问:如何让你开发的 App 可以一直在后台运行?

  • 答:后台放无声音频就阔以咯。

  • 问:后台放无声音频需要 Background Mode,审核阔能不通过。

  • 答:给你的 App 一个可以正当使用 Background Mode 的理由,比如说视频播放,比如说画中画。

Demo源码:

GitHub - CaiWanFeng/PiP: The best way to customize picture-in-picture for iOS.The best way to customize picture-in-picture for iOS. - GitHub - CaiWanFeng/PiP: The best way to customize picture-in-picture for iOS.icon-default.png?t=O83Ahttps://github.com/CaiWanFeng/PiP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/446372.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android平台RTSP|RTMP播放器PK:VLC for Android还是SmartPlayer?

好多开发者,希望在Android端低延迟的播放RTMP或RTSP流,本文就目前市面上主流2个直播播放框架,做个简单的对比。 VLC for Android VLC for Android 是一款功能强大的多媒体播放器,具有以下特点和功能: 广泛的格式支持…

FFmpeg的简单使用【Windows】--- 简单的视频混合拼接

实现功能 点击【选择文件】按钮在弹出的对话框中选择多个视频,这些视频就是一会将要混剪的视频素材,点击【开始处理】按钮之后就会开始对视频进行处理,处理完毕之后会将处理后的文件路径返回,并在页面展示处理后的视频。 视频所…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段,即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段,构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

JAVA就业笔记4——第二阶段(1)

课程须知 A类知识:工作和面试常用,代码必须要手敲,需要掌握。 B类知识:面试会问道,工作不常用,代码不需要手敲,理解能正确表达即可。 C类知识:工作和面试不常用,代码不…

Redis:分布式 - 主从复制

Redis:分布式 - 主从复制 概念配置主从模式info replicationslave-read-onlytcp-nodelay 命令slaveof 主从结构一主一从一主多从 主从复制流程数据同步命令全量同步部分同步实时同步 节点晋升 概念 Redis的最佳应用,还是要在分布式系统中。对于非分布式…

Dockerfile 详解

Dockerfile是自定义Docker镜像的一套规则,由多条指令构成,每条指令都会对应于Docker镜像中的每一层,因为Docker是分层存储的。以下是Dockerfile中各个参数的详解及演示解析: 1. FROM 功能:指定待扩展的父级镜像&#…

【Linux系列】写入文本到文件

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

智慧乡村可视化设计,让美丽的乡村更加魅力。

智慧乡村可视化设计为美丽的乡村注入了新的活力,使其更加魅力四射。 通过可视化设计,乡村的自然风光得以更生动地展现。高清的全景图像、实时的视频监控,让人们仿佛身临其境,感受乡村的青山绿水、田园风光。 古老的村落、宁静的…

关于int*的*号归属权问题

再根据函数指针定义:int (*int) (int a)。我们发现*和后面的标识符才是一体的 所以int *a,b;的写法更好,说明a是指针类型,b是int类型

Python_函数式编程(生成器、迭代器、动态性)

简单说:时间换空间!想要得到庞大的数据,又想让它占用空间少,那就用生成器!延迟计算!需要的时候,再计算出数据! 创建生成器的方式二(生成器函数)生成器函数: 如果一个函数…

算法修炼之路之位运算

目录 一:位运算符及一些常用结论总结 1.给一个数n,确定它的二进制表示中的第x位是0还是1(位数从右向左0开始增加) 2.将一个数n的二进制表示形式的第x位修改成1 3.将一个数n的二进制表示的第x位修改为0 4.提取一个数n的二进制表示中最右侧的1 5.干掉一个数n的…

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…

24/10/12算法笔记 VGG

VGG特点: 1.深度:非常深 2.卷积核采用3*3,使得网络能够捕捉到更细粒度的图像特征 3.全连接层:使用全连接层来分类 4.使用ReLU激活函数,有助于缓解梯度消失 5.在卷积层和池化层后,使用局部归一化&#…

7-I2C与AHT20温湿度传感器

I2C与AHT20温湿度传感器 嵌入式领域另一种常见的通信IIC通信,并用其与AHT20传感器进行交互,获取房间的温度与湿度。 I2C有一条用于传递数据的数据线称为SDA(Serial Data),另一条是用于提供同步时钟脉冲的时钟线SCL&am…

oracle数据坏块处理(一)-通过rman备份修复

表有坏块时,全表查询会报错: 这时候如果有前面正常的rman备份,那么我们就可以通过rman备份直接对数据文件块做恢复 先对数据文件做个逻辑检查: RMAN> backup check logical VALIDATE DATAFILE EXB_DATA/exb/datafile/cuteinf…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接:https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览:http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

【算法思想·二叉树】用「遍历」思维解题 II

本文参考labuladongsuanfa笔记[【强化练习】用「遍历」思维解题 II | labuladong 的算法笔记] 如果让你在二叉树中的某些节点上做文章,一般来说也可以直接用遍历的思维模式。 270. 最接近的二叉搜索树值 | 力扣 | LeetCode | 给你二叉搜索树的根节点 root 和一个目…

Android Studio开发Kotlin项目中遇到的问题解决集

背景&#xff1a;Android Studio 2022.3.1 1.Unexpected tokens (use ; to separate expressions on the same line) 无法在同一行声明一个变量并实例化。 解决&#xff1a;分开 &#xff08;1&#xff09; var aaCo:Runoob<String>aaCoRunoob("aa") &…

阿里云dataworks测试

文章目录 开始查看全局信息查看数据源信息(endpoint与project的信息)查看绑定、解绑钉钉创建、查看AccessKey(Access Key ID与Access Key Secret) 线上开发新建开发节点mysqlpython 本地开发python 程序调度 开始 参考文档&#xff1a;https://help.aliyun.com/zh/ram/user-gu…

Stm32+Esp8266连接阿里云程序移植教程(MQTT协议)

Stm32Esp8266连接阿里云程序移植教程&#xff08;MQTT协议&#xff09; 一、前期准备二、移植过程三、程序的使用3.1 连接上阿里云3.2 传输用户数据到阿里云3.3 解析从阿里云下发给用户的数据3.4 关于调试接口 一、前期准备 自己要的工程文件移植所需的文件&#xff08;如下图&…