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

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

相关文章:

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

iOS 14,基于 AVPictureInPictureController,实现自定义画中画,涵盖所有功能与难点。 市面上的各种悬浮钟和提词器的原理都是基于此。 Demo源码在文末。 使用 iOS 画中画的要求: 真机,不能使用模拟器;iO…...

【C#生态园】完整解读C#网络通信库:从基础到实战应用

探索C#网络通信库:功能、用途和最佳实践 前言 随着互联网的快速发展,网络通信在现代软件开发中扮演着至关重要的角色。C#作为一种流行的编程语言,拥有多个优秀的网络通信库,为开发人员提供了丰富的选择。本文将深入探讨几种常用…...

js面试题---事件委托是什么

事件委托是JavaScript中的一种事件处理模式,通过将事件处理程序绑定到父元素,而不是直接绑定到每个子元素,从而优化事件管理和提高性能。 1 工作原理 事件冒泡:当一个事件在某个元素上发生时,它会从该元素向上冒泡到…...

谷歌浏览器 文件下载提示网络错误

情况描述: 谷歌版本:129.0.6668.90 (正式版本) (64 位) (cohort: Control)其他浏览器,比如火狐没有问题,但是谷歌会下载失败,故推断为谷歌浏览器导致的问题小文件比如1、2M会成功,大…...

【记录】PPT|PPT 箭头相交怎么跨过

众所周知,在PPT中实现“跨线”效果并非直接可行,这一功能仅存在于Visio中。然而,通过一些巧妙的方法,我们可以在PPT中模拟出类似的效果。怎么在PPT中画交叉但不重叠的线-百度经验中介绍了一种方法,而本文将介绍一种改进…...

Linux中如何修改root密码

在 Linux 中,修改 root 用户密码可以通过以下步骤进行。你需要具有超级用户权限才能执行这些操作。 方法一:使用 passwd 命令修改 root 密码 使用具有超级用户权限的账户登录 如果你已经以 root 身份登录,或者你当前账户具备超级用户权限&am…...

中间件:SpringBoot集成Redis

一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists&#xff09…...

数据中心建设方案,大数据平台建设,大数据信息安全管理(各类资料原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏…...

TDD(测试驱动开发)是否已死?

Rails 大神、创始人 David Heinemeier Hansson 曾发文抨击TDD。 TDD is dead. Long live testing. (DHH) 此后, Kent Beck、Martin Fowler、David Hansson 三人就这个观点还举行了系列对话(辩论) Is TDD Dead? 笔者作为一个多年在软件测试领域摸索的人&…...

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic

Debezium系列之:实时从TDengine数据库采集数据到Kafka Topic 一、认识TDengine二、TDengine Kafka Connector三、什么是 Kafka Connect?四、前置条件五、安装 TDengine Connector 插件六、启动 Kafka七、验证 kafka Connect 是否启动成功八、TDengine Source Connector 的使用…...

数据结构(一)顺序表

顺序表的概念及结构 线性表 线性表是具有相同特征的数据结构的集合 物理结构 不一定连续 逻辑结构 连续 顺序表 顺序表是线性表的一种,顺序表的底层是数组 物理结构 连续 逻辑结构 连续 顺序表分类 静态顺序表 struct SeqList {int a…...

如何在 Jupyter Notebook 执行和学习 SQL 语句(中)

1. 基础SQL操作 创建数据库和表,插入数据: import sqlite3# 创建SQLite数据库并连接 conn sqlite3.connect(example.db) cursor conn.cursor()# 创建用户表 cursor.execute(CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT…...

AutosarMCAL开发——基于EB Wdg驱动

目录 一、Wdg原理以及作用1.看门狗类型2.看门狗功能特点3.看门狗工作模式4.看门狗超时响应5.看门狗寄存器 二、WDG模块EB配置(TC3X系列MCU)1.WDG通用配置:2.WDG设置:3.时钟资源分配4.配置STM IRQ中断5.配置触发执行动作&#xff1…...

Linux(1. 基本操作_命令)

目录 关于超级用户root: root用户可以做什么? 避免灾难: 格式约定: 浏览硬盘: 命令行补全和通配符: 命令行补全: 通配符: 常用基本命令: 查看目录和文件&#xff…...

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…...

小米路由器刷机istoreOS,愉快上网

istoreOS与openwrt openwrt是一个开源的路由器系统,市场上所有小米路由器的内部系统都是基于openwrt进行二次开发形成的,做了硬件适配和功能上的阉割,不太好用。 istoreos是小宝团队基于openwrt制作的一个发行版,更适合中国宝宝体质。页面简约华丽,完全兼容开源openwrt的…...

微信小程序 - 01 - 一些补充和注意点(补充ing...)

目录 一、节流二、在一个发请求的函数中,只有发生下拉动作,才执行关闭下拉代码 最近在学微信小程序,把学习过程中的一些补充和注意点总结一下,内容会比较简单,因为只涉及基础知识,供个人参考 一、节流 情…...

微服务实战——登录(普通登录、社交登录、SSO单点登录)

登录 1.1. 用户密码 PostMapping("/login")public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session){R r memberFeignService.login(vo);if(r.getCode() 0){MemberRespVo data r.getData("data", new Type…...

windows 安装 ElasticSearch

1、下载安装包 下载地址:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.14.3-windows-x86_64.zip ElasticSearch 目录结构如下: 2、配置JDK环境 ES比较耗内存,建议虚拟机4G或以上内存,jvm1g以上的内存分…...

Oracle Linux 9 (CentOS Stream 9) 安装 node.js 20

Oracle Linux 的 node 默认版本为 16,运行dnf update也无法改变大版本,还需要进行额外操作1 查看支持的版本 sudo dnf module list nodejs输出如下 Last metadata expiration check: 3:37:22 ago on Fri 11 Oct 2024 09:08:18 PM JST. Oracle Linux 9 Ap…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

腾讯云V3签名

想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

day36-多路IO复用

一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...