iOS14畫中畫功能實現(xiàn)

1.開啟后臺模式


image.png

2.導(dǎo)入框架#import <AVKit/AVKit.h> 創(chuàng)建AVPictureInPictureController
注:如果是使用系統(tǒng)播放器AVPlayerViewController,設(shè)置allowsPictureInPicturePlayback = YES即可

//1.判斷是否支持畫中畫功能
if ([AVPictureInPictureController isPictureInPictureSupported]) {
    //2.開啟權(quán)限
    @try {
        NSError *error = nil;
        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionOrientationBack error:&error];
        [[AVAudioSession sharedInstance] setActive:YES error:&error];
    } @catch (NSException *exception) {
        NSLog(@"AVAudioSession發(fā)生錯誤");
    }
    self.pipVC = [[AVPictureInPictureController alloc] initWithPlayerLayer:self.player];
    self.pipVC.delegate = self;
}

3.開啟或關(guān)閉畫中畫

if (self.pipVC.isPictureInPictureActive) {
    [self.pipVC stopPictureInPicture];
} else {
    [self.pipVC startPictureInPicture];
}

4.代理 AVPictureInPictureControllerDelegate

// 即將開啟畫中畫
- (void)pictureInPictureControllerWillStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 已經(jīng)開啟畫中畫
- (void)pictureInPictureControllerDidStartPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 開啟畫中畫失敗
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController failedToStartPictureInPictureWithError:(NSError *)error;
// 即將關(guān)閉畫中畫
- (void)pictureInPictureControllerWillStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 已經(jīng)關(guān)閉畫中畫
- (void)pictureInPictureControllerDidStopPictureInPicture:(AVPictureInPictureController *)pictureInPictureController;
// 關(guān)閉畫中畫且恢復(fù)播放界面
- (void)pictureInPictureController:(AVPictureInPictureController *)pictureInPictureController restoreUserInterfaceForPictureInPictureStopWithCompletionHandler:(void (^)(BOOL restored))completionHandler;

值得注意的是,關(guān)閉畫中畫會執(zhí)行
pictureInPictureController:restoreUserInterfaceForPictureInPictureStopWithCompletionHandler: 這個代理方法,用來恢復(fù)播放界面的

全局畫中畫注意點
  1. 通過一個全局變量持有畫中畫控制器,可以在pictureInPictureControllerWillStartPictureInPicture持有,pictureInPictureControllerDidStopPictureInPicture釋放;
  2. 有可能不是點畫中畫按鈕,而是從其它途徑來打開當(dāng)前畫中畫控制器,可以在viewWillAppear 進行判斷并關(guān)閉;
  3. 已有畫中畫的情況下開啟新的畫中畫,需要等完全關(guān)閉完再開啟新的,防止有未知的錯誤出現(xiàn),因為關(guān)閉畫中畫是有過程的;
  4. 如果創(chuàng)建AVPictureInPictureController并同時開啟畫中畫功能,有可能會失效,出現(xiàn)這種情況延遲開啟畫中畫功能即可。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容