iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案
iOS 14,基于 AVPictureInPictureController,实现自定义画中画,涵盖所有功能与难点。
市面上的各种悬浮钟和提词器的原理都是基于此。
Demo源码在文末。
使用 iOS 画中画的要求:
- 真机,不能使用模拟器;
- iOS 14 及以上;
- 开启后台模式:
技术点:
- 添加任意 view 到画中画窗口;
- 按需隐藏系统的快进快退按钮、播放按钮、进度条;
- 用代码动态修改画中画窗口的形状,横向、竖向 or 方形;
- 用代码旋转画中画窗口;
- 基于常驻线程的线程保活措施,让你的画中画永不停歇;
- 拍照和录视频不会中断画中画;
- 拍摄视频画中画的 timer 也不会停止;
- 高精度 timer;
- 用代码控制进入后台自动开启画中画;
- 如何应对苹果的审核。
演示视频:
核心功能:
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.https://github.com/CaiWanFeng/PiP
iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案相关推荐
- uniapp 画中画悬浮窗(视频) Ba-VideoPip
简介(下载地址) Ba-VideoPip 是一款画中画方式的视频悬浮窗插件.支持点播.直播:支持官方.三方播放器无缝切换:支持动态刷新(如切换视频或进度). 支持点播.直播 支持官方.三方播放器无缝切 ...
- iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...
iOS精选源码 iOS WKWebView的使用源码 模仿apple music 小播放器的交互实现 高仿微信的悬浮小窗口 iOS仿支付宝首页效果 [swift]仿微信悬浮窗 类似于今日头条,网易新闻 ...
- ios居然自带悬浮窗调试工具
我们经常使用各种调试工具,或者开源库来支持悬浮窗调试信息,但苹果的私有方法就提供了UIDebuggingInformationOverlay. 系统要求: ios10+,iOS11 目前在我自己的手 ...
- android 仿ios悬浮窗,iOS高仿微信悬浮窗、忍者小猪游戏、音乐播放器、支付宝、今日头条布局滚动效果等源码...
iOS精选源码 iOS优质博客 之前看了很多面试题,感觉要不是不够就是过于冗余,于是我将网上的一些面试题进行了删减和重排,现在分享给大家.(题目来源于网络,侵删)1. Object-c的类可以多重继承 ...
- Android开发笔记(一百一十八)自定义悬浮窗
WindowManager 在前面< Android开发笔记(六十六)自定义对话框>中,我们提到每个页面都是一个Window窗口,许多的Window对象需要一个管家来打理,这个管家我们称之 ...
- 悬浮窗播放器html,Chrome扩展插件悬浮画中画播放器推荐
今天给大家安利一个 Chrome 扩展插件,可将绝大多数的 HTML 5 直播或视频通过画中画悬浮窗的的形式播放,特别适合一边看视频一边工作.插件名称叫:[悬浮画中画播放器] 插件使用方法: 插件使用 ...
- 移动自定义悬浮窗(图片)
对于自定义悬浮窗的移动,首先是有自定义悬浮窗的xml文件,其中最关键的是设置监听事件,然后重写监听事件即可.具体如代码所示: 对于应用在系统的悬浮窗权限需要在manifest中声明: <uses ...
- 苹果屏幕自动变暗_苹果iOS 14震撼发布 全新功能对标安卓
今天凌晨1点,苹果WWDC 2020开发者大会正式召开,在这次开发者大会上,苹果为我们带来了不少新玩意,接下来就跟随我们的脚步一起看看吧. iOS 14 三个便捷新功能iOS 14是本次WWDC上的一 ...
- uniapp 来电显示悬浮窗插件(支持锁屏来电) Ba-CallerID
简介(下载地址) Ba-CallerID 是一款来电显示悬浮窗插件插件. 支持显示.隐藏 支持锁屏来电显示 支持自定义位置显示(上.中.下) 支持拖动(这版不支持,需要的话可以加) 支持申请.判断悬浮 ...
最新文章
- 【Pandas库】(1) Series的创建方法
- [转]css选择器优先级深入理解
- pyav Invalid data found when processing input (libav.h264: no frame!)
- Oracle 查看sql语句执行计划方法
- html 中表格长度固定
- PHP浮点运算结果出现误差原因分析及解决方案
- java guava_java项目中使用guava的工具包的心得
- DFA和NFA的区别
- 32 位的有符号整数_「js基础」JavaScript逻辑和位运算符归纳
- 【PHP】Ajax跨域解决方案 、jsonp、cors
- Python 集合 day3
- 常见SMTP发送失败原因列表
- IAR模板--怎样在IARproject中创建和使用模板
- (已更新)视频app小程序模板源码
- WordPress插件 AffiliateWP 电商联盟推广插件汉化/中文版[更新至v1.8]
- visio2016无法安装的完美解决方法
- dep指定版本 go_Golang官方依赖管理工具:dep
- 米勒拉宾素性检验(代码模板)
- 立秋养生,老话说“三不吃、三不做、三不睡”,精神饱满健康过秋
- WebRTC 入门教程(二)| WebRTC信令控制与STUN/TURN服务器搭建