🦋

【iOS】SwiftUIアプリにピクチャ・イン・ピクチャ(PiP)を統合する方法

2024/04/11に公開

SwiftUIでのPiP実装のステップ

PiPの実装は、AVKitAVPictureInPictureControllerを使用することにより行われます。ここでは、SwiftUIアプリケーションでPiP機能を統合するためのステップを詳しく説明します。

Step 1: プレイヤーのセットアップ

まず、AVPlayerを使用してビデオプレイヤーをセットアップします。このプレイヤーは、ビデオコンテンツを再生するために必要です。次に、AVPlayerLayerにこのプレイヤーを割り当て、そのレイヤーをビューのサブレイヤーとして追加します。

import AVKit

class VideoPlayerViewController: UIViewController {
    private var playerLayer: AVPlayerLayer?
    var player: AVPlayer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupPlayer()
    }

    private func setupPlayer() {
        guard let player = player else { return }
        playerLayer = AVPlayerLayer(player: player)
        playerLayer?.frame = self.view.bounds
        playerLayer?.videoGravity = .resizeAspect
        if let playerLayer = playerLayer {
            self.view.layer.addSublayer(playerLayer)
        }
    }
}

Step 2: PiPのセットアップ

PiP機能は、AVPictureInPictureControllerを使用して実装されます。このコントローラは、PiPがサポートされているデバイスでのみ使用可能です。そのため、サポートの有無をチェックする必要があります。

private func setupPiP() {
    guard AVPictureInPictureController.isPictureInPictureSupported() else {
        print("PiP is not supported on this device.")
        return
    }

    pipController = AVPictureInPictureController(playerLayer: playerLayer!)
    pipController?.delegate = self
}

Step 3: PiPモードの開始

PiPモードは、ユーザーのアクションに応じて開始されるべきです。例えば、ボタンをタップしたときにPiPを開始することができます。

Button("Start PiP") {
    // PiPを開始する
    if let viewController = UIApplication.shared.windows.first?.rootViewController as? VideoPlayerViewController {
        viewController.startPiP()
    }
}

これでPiPを実装できました。
サンプルコードを書いたので確認してください!

https://github.com/entaku0818/AudioMaster/blob/main/AudioMasterApp/AudioMasterApp/AudioMasterApp/AVF/PiPVideoPlayerView.swift

Discussion