top of page
Matt

iOS用Swiftでビデオ背景ビューコントローラーを作成する:ステップバイステップガイド

このチュートリアルでは、リピート再生するビデオ背景を持つiOS SwiftのViewControllerの作成方法を示します。


目次


以下の例は、東京の夜景をループする背景ビデオを持つシンプルなメニューを示しています:




長所と短所

まず、なぜこれをしたいのかを探りますが、すぐにコードに進みたい場合は、[ここ]をクリックしてください


長所

  • 美的魅力:ビデオ背景はアプリをよりダイナミックで魅力的に見せ、ユーザーの視覚体験を高めることができます。

  • ブランド表現:ブランドのアイデンティティを伝えたり、アプリ内に特定の雰囲気を作り出す効果的な方法です。

  • ユーザーの関与:適切に選ばれたビデオはユーザーの興味と関与を高め、セッション時間を延ばす可能性があります。

  • ストーリーテリング:ビデオは、静止画像やテキストよりも没入感のある方法で物語を語ったり、情報を伝えたりするのに使用できます。

  • 文脈情報:場合によっては、ビデオ背景がアプリのコンテンツや機能に関連する有用な文脈や情報を提供することがあります。


短所

  • パフォーマンスへの影響:ビデオの再生はリソースを多く消費し、バッテリーの消耗を増やし、アプリのパフォーマンスを低下させる可能性があります。

  • アプリサイズの増加:ビデオファイルを含めると、アプリのサイズが大幅に増加する可能性があり、ストレージ容量に限りのあるユーザーにとっては問題になるかもしれません。

  • 気を散らすこと:注意深く使用しない場合、ビデオの背景はユーザーを散漫にさせ、重要なコンテンツや機能に集中することを困難にすることがあります。

  • データ使用量:ビデオがインターネットからストリーミングまたはダウンロードされる場合、多くのデータを消費する可能性があり、データプランに制限のあるユーザーにとっては理想的ではないかもしれません。

  • アクセシビリティの問題:特に点滅や動きが速い要素を含むビデオは、特定の障害や感受性を持つユーザーにとって問題になることがあります。

  • ロード時間:ビデオを組み込むことで、特にモバイル用に最適化されていない場合、ビューコントローラのロード時間が増加する可能性があります。


ベストプラクティス

  • モバイルデバイスに適切に最適化されたビデオを使用して、パフォーマンスとロードの問題を最小限に抑えます。

  • よりシンプルなインターフェースを好むユーザーやバッテリー/データの節約が必要なユーザーのために、ビデオ背景を無効にするオプションを検討します。

  • ビデオコンテンツを利用できないユーザーのために代替コンテンツを提供するなど、アクセシビリティのガイドラインに注意します。

  • ビデオコンテンツをアプリの目的に関連させ、ユーザー体験を向上させることを確実にします。


要約すると、ビデオ背景は視覚的に印象的で魅力的ですが、パフォーマンス、アクセシビリティ、およびユーザー体験に関する潜在的な欠点とこれらの利点のバランスを取ることが重要です。


ステップバイステップのVideoViewController

1. 必要なフレームワークのインポート

import UIKit
import AVKit
import AVFoundation

必要なフレームワークのインポートから始めます:

  • UIKit:これはiOSインターフェースを構築するための基本的なフレームワークです。

  • AVKitとAVFoundation:これらはビデオ再生に不可欠なオーディオビジュアルメディアを扱うために使用されます。


2. VideoViewControllerクラスの定義

class VideoViewController: UIViewController {
    var videoName: String

ここでは、UIViewControllerから継承する新しいクラスVideoViewControllerを定義します。また、ビデオファイルの名前を保持する変数videoNameを宣言します。


3. ビデオ再生のためのプロパティの定義

fileprivate var queuePlayer: AVQueuePlayer?
fileprivate var playerLayer: AVPlayerLayer?
fileprivate var playbackLooper: AVPlayerLooper?
  • queuePlayer:再生キューを管理するAVQueuePlayerオブジェクト。

  • playerLayer:ビューのレイヤーにビデオコンテンツを表示するAVPlayerLayer。

  • playbackLooper:ビデオのシームレスなループを容易にするAVPlayerLooper。


4. コントローラーの初期化

init(videoName: String) {
    self.videoName = videoName
    super.init(nibName: nil, bundle: nil)
}

初期化子はvideoNameプロパティを設定し、スーパークラスの初期化子を呼び出します。正しいファイルを再生するためには、ビデオ名が必要なので、このカスタムinitが必要です。


5. viewDidLoadのオーバーライド

override func viewDidLoad() {
    super.viewDidLoad()
    
    playBackgroundVideo()
}

viewDidLoadメソッドでは、playBackgroundVideo()を呼び出します。このメソッドは、ビューコントローラーのビューがメモリにロードされるときに実行されます。


6. ビデオファイルの検索

guard let path = Bundle.main.path(forResource: videoName, ofType: "mp4") else {
    return
}

ここでは、アプリバンドル内のビデオファイルのパスを見つけようとします。存在しない場合、関数は早期に戻ります。

7. プレイヤーの設定

let playerItem = AVPlayerItem(url: URL(fileURLWithPath: path))
self.queuePlayer = AVQueuePlayer(playerItem: playerItem)
self.playerLayer = AVPlayerLayer(player: self.queuePlayer)

ビデオURLを持つAVPlayerItemを作成し、それを使用してqueuePlayerとplayerLayerを初期化します。


8. ループとレイヤーの設定

guard let playerLayer = self.playerLayer else { return }
guard let queuePlayer = self.queuePlayer else { return }
self.playbackLooper = AVPlayerLooper.init(player: queuePlayer, templateItem: playerItem)
playerLayer.videoGravity = .resizeAspectFill
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
  • ビデオをループするためのplaybackLooperを設定します。

  • videoGravityをresizeAspectFillに設定し、アスペクト比を維持せずにビデオがビューの全体を覆うようにします。

  • playerLayerのフレームをビューの境界に合わせます。

  • ビューのレイヤーにplayerLayerをサブレイヤーとして追加します。


9. ビデオの再生を開始

queuePlayer.play()

最後に、ビデオの再生を開始します。

このコードにより、無限にループするフルスクリーンのビデオ背景を持つビューコントローラーが作成されます。ビデオファイルはアプリバンドルに含める必要があり、VideoViewControllerのインスタンスを作成する際にその名前で指定する必要があります。


VideoViewController:

import UIKit
import AVKit
import AVFoundation

class VideoViewController: UIViewController {
    var videoName: String
    
    fileprivate var queuePlayer: AVQueuePlayer?
    fileprivate var playerLayer: AVPlayerLayer?
    fileprivate var playbackLooper: AVPlayerLooper?
    
    init(videoName: String) {
        self.videoName = videoName
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        playBackgroundVideo()
    }

    func playBackgroundVideo() {
        guard let path = Bundle.main.path(forResource: videoName, ofType: "mp4") else {
            return
        }
        
        let playerItem = AVPlayerItem(url: URL(fileURLWithPath: path))
                
        self.queuePlayer = AVQueuePlayer(playerItem: playerItem)
        self.playerLayer = AVPlayerLayer(player: self.queuePlayer)
        guard let playerLayer = self.playerLayer else { return }
        guard let queuePlayer = self.queuePlayer else { return }
        self.playbackLooper = AVPlayerLooper.init(player: queuePlayer, templateItem: playerItem)
        
        playerLayer.videoGravity = .resizeAspectFill
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
        
        queuePlayer.play()
    }
}

Example usage, MenuViewController:

import UIKit

class MenuViewController: VideoViewController {
    init() {
        super.init(videoName: "MenuVideo")
    }

    required init?(coder: NSCoder) {
        super.init(videoName: "MenuVideo")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setUpButtons()
    }

    fileprivate func setUpButtons() {
        let playGameButton = UIButton()
        playGameButton.translatesAutoresizingMaskIntoConstraints = false
        playGameButton.setTitle("Play Game", for: .normal)
        playGameButton.setTitleColor(.black, for: .normal)
        playGameButton.backgroundColor = .white
        playGameButton.addTarget(self, action: #selector(playGameButtonTapped), for: .touchUpInside)
        self.view.addSubview(playGameButton)
        
        let optionsButton = UIButton()
        optionsButton.translatesAutoresizingMaskIntoConstraints = false
        optionsButton.setTitle("Options", for: .normal)
        optionsButton.setTitleColor(.black, for: .normal)
        optionsButton.backgroundColor = .white
        optionsButton.addTarget(self, action: #selector(optionsButtonTapped), for: .touchUpInside)
        self.view.addSubview(optionsButton)
        
        NSLayoutConstraint.activate([
            playGameButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            playGameButton.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: -30),
            playGameButton.widthAnchor.constraint(equalToConstant: 200),
            playGameButton.heightAnchor.constraint(equalToConstant: 50),

            optionsButton.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            optionsButton.topAnchor.constraint(equalTo: playGameButton.bottomAnchor, constant: 20),
            optionsButton.widthAnchor.constraint(equalToConstant: 200),
            optionsButton.heightAnchor.constraint(equalToConstant: 50)
        ])
    }

    @objc func playGameButtonTapped() {
        print("Play Game button pressed")
    }

    @objc func optionsButtonTapped() {
        print("Options button pressed")
    }
}

サポートの方法

このコンテンツは常に無料で提供され、価値があると思われる場合は、他の人と共有することを検討してください。また、私たちのゲームをダウンロードして正直なレビューを残すことは、大きなサポートになります。質問やフィードバックがあればお気軽にご連絡ください。私たちは最善を尽くして応答します。


今すぐApple App StoreからFalling Skyをダウンロードしてください: https://apps.apple.com/app/id6446787964


Xで私たちをフォローしてください: https://x.com/_kingdomarcade

閲覧数:12回
bottom of page