基于 iOS 14 的 AVPictureInPictureController
,完全自定义画中画,已覆盖市面上所有画中画的核心和难点。
iOS Android Flutter 全部平台,全部代码,全部开源!!!
更多功能持续更新中,欢迎star!
iOS demo 运行环境:
真机 & iOS14或以上
demo 展示:
- 悬浮提词器:
- 悬浮秒表:
因为 Android 的自定义画中画无任何难度,所以此处只讨论 iOS 的自定义画中画。
你如果在画中画弹出前后将所有 window 打印出来,你就会发现,当画中画弹出后,多了一个 window,而这个 window 就是你添加自定义 view 的 window。
AVPictureInPictureController
提供的接口就那几个,你尝试了所有接口都实现不了。这个时候就可以断定,这个功能是通过私有 api 来实现的了。
那么如何找到那个私有api?两种方法:
- 使用
Runtime
的 api 打印出所有私有属性; - 使用工具: https://developer.limneos.net/index.php?ios=14.4&framework=AVKit.framework&header=AVPictureInPictureController.h
有了私有属性列表,后面就自行尝试了。
窗口的形状由视频的形状决定,修改视频源就可以修改窗口形状。
详见demo源码。
详见demo源码。
播放无声音频。
AVPictuerInPictureController
提供了一个属性:
if #available(iOS 14.2, *) {
pipController.canStartPictureInPictureAutomaticallyFromInline = true
} else {
// Fallback on earlier versions
}
注:播放器必须处于播放状态。
KVO,监听画中画里view大小的变化;或者直接在 layoutSubviews
方法里处理。
调用下面方法:
UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
使用 CADisplayLink
。
使用 GCD Timer。
苹果可能会因为你使用了后台权限而拒绝你,这个时候你可以在APP里添加一个系统播放器,就播放画中画的使用教程,有了系统播放器,你就可以理所当然的使用画中画了。
或者用一个web,web里的播放器也会调用系统播放器。