画中画仅支持iPad(iOS 9级以上)

首先,来一波效果图:

ios开发 自动开启画中画开关功能 苹果画中画自动关闭_iPadOS


ios开发 自动开启画中画开关功能 苹果画中画自动关闭_画中画_02

ios开发 自动开启画中画开关功能 苹果画中画自动关闭_ios开发 自动开启画中画开关功能_03

当前应用内开启画中画的效果

ios开发 自动开启画中画开关功能 苹果画中画自动关闭_iPadOS_04

类介绍

@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)
}

官方Demo

重点

  • 1.开启后台模式(Audio,AirPlay,and Picture in Picture).
  • 2.设置(playback或是playAndRecord)的AVAudioSession
  • 3.持有一个AVPictureInPictureController属性.
  • 4.关于WKWebView.设置allowsPictureInPictureMediaPlayback为YES即可支持pip.

关于第三条,举个例子.如果直接在ViewDidLoad里面创建一个局部的AVPictureInPictureController.(initWith.AVPlayer的layer).是不会有pip画面的.

上文中的系统带的开启/关闭画中画图片:

开启画中画图片:

ios开发 自动开启画中画开关功能 苹果画中画自动关闭_ios开发 自动开启画中画开关功能_05

关闭画中画图片:

ios开发 自动开启画中画开关功能 苹果画中画自动关闭_iOS_06