画中画仅支持iPad(iOS 9级以上)
首先,来一波效果图:
当前应用内开启画中画的效果
类介绍
@available(iOS 9.0, *)
open class AVPictureInPictureController : NSObject {
/// 类方法,检测是否支持画中画
open class func isPictureInPictureSupported() -> Bool
/// 系统自带的开启画中画功能图片(PS:一般用在开启画中画功能按钮上)
open class func pictureInPictureButtonStartImage(compatibleWith traitCollection: UITraitCollection?) -> UIImage
/// 系统自带的停止画中画功能图片(PS:一般用在停止画中画功能按钮上)
open class func pictureInPictureButtonStopImage(compatibleWith traitCollection: UITraitCollection?) -> UIImage
/// 系统自带的开启画中画功能图片(PS:一般用在开启画中画功能按钮上)
open class var pictureInPictureButtonStartImage: UIImage { get }
/// 系统自带的停止画中画功能图片(PS:一般用在停止画中画功能按钮上)
@available(iOS 13.0, *)
open class var pictureInPictureButtonStopImage: UIImage { get }
/// pip创建方法
public init?(playerLayer: AVPlayerLayer)
/// 播放的playerLayere
open var playerLayer: AVPlayerLayer { get }
/// pip代理
weak open var delegate: AVPictureInPictureControllerDelegate?
/// 开启画中画.将会调用`-pictureInPictureControllerWillStartPictureInPicture:'.如果开启成功,将会调用`-pictureInPictureControllerDidStartPictureInPicture:`.如果开启失败,将会调用`-pictureInPictureControllerFailedToStartPictureInPicture:withError:`
open func startPictureInPicture()
/// 停止画中画功能(播放不会停止.会跑到之前的avplayerlayer上)
open func stopPictureInPicture()
/// 是否可以进行画中画
open var isPictureInPicturePossible: Bool { get }
/// 当前画中画是否已经开启(画中画是否处于活动状态)
open var isPictureInPictureActive: Bool { get }
/// 画中画是否处于暂停状态
open var isPictureInPictureSuspended: Bool { get }
}
/// 画中画代理
@available(iOS 9.0, *)
public protocol AVPictureInPictureControllerDelegate : NSObjectProtocol {
/// 画中画将要开始
optional func pictureInPictureControllerWillStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController)
/// 画中画成功开启
optional func pictureInPictureControllerDidStartPictureInPicture(_ pictureInPictureController: AVPictureInPictureController)
/// 画中画开启失败
optional func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, failedToStartPictureInPictureWithError error: Error)
/// 画中画将要停止
optional func pictureInPictureControllerWillStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController)
/// 画中画已经停止
optional func pictureInPictureControllerDidStopPictureInPicture(_ pictureInPictureController: AVPictureInPictureController)
/// 当画中画播放结束时.使用此方法重新建立视频播放用户界面(无论如何结束都会调动此方法.1.播放视频结束.2.用户点X结束.3.用户点按返回App.PS:暂停和播放按钮不会调用)
optional func pictureInPictureController(_ pictureInPictureController: AVPictureInPictureController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void)
}
重点
- 1.开启后台模式(Audio,AirPlay,and Picture in Picture).
- 2.设置(playback或是playAndRecord)的AVAudioSession
- 3.持有一个AVPictureInPictureController属性.
- 4.关于WKWebView.设置allowsPictureInPictureMediaPlayback为YES即可支持
pip
.
关于第三条,举个例子.如果直接在ViewDidLoad里面创建一个局部的AVPictureInPictureController.(initWith.AVPlayer的layer).是不会有pip
画面的.
上文中的系统带的开启/关闭画中画图片:
开启画中画图片:
关闭画中画图片: