Swift/TIL(TodayILearned)

[Swift|TIL] 240503 - AVKit으로 동영상 재생하기 - ViewController 초기화 함수 init(nibName:bundle:)

yurim-dev 2024. 5. 3. 22:16

1. AVKit으로 동영상 재생하는 코드


아래 코드는 AVKit으로 동영상을 재생하는 ViewController이다.

import UIKit
import AVKit

class ViewController: UIViewController {
    
    let url = URL(string: "https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4")!
    
    // AVPlayerController 생성
    let playerController = AVPlayerViewController()
    
    // AVPlayer 생성
    var player: AVPlayer!
    
    // 재생 버튼 생성
    let playButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("Play Video", for: .normal)
        button.addTarget(self, action: #selector(playButtonTapped), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        return button
    }()
    
    // MARK: - 초기화
    // 초기화 방법 1
    init() {
        // AVPlayer 초기화
        player = AVPlayer(url: url)
        super.init(nibName: nil, bundle: nil)
    }
    
    // 초기화 방법 2
//    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
//        player = AVPlayer(url: url)
//        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
//    }
    
    required init?(coder: NSCoder) {
//        super.init(coder: coder)
        fatalError("init(coder:) has not been implemented")
    }
    
    
    // 뷰 로드 시
    override func viewDidLoad() {
        super.viewDidLoad()
        setConstraints()
    }
    
    // playButton이 눌렸을 때 호출되는 함수
    @objc func playButtonTapped() {
        // AVPlayer 할당
        playerController.player = player
        
        // AVPlayerController 노출
        present(playerController, animated: true) {
            self.player.play() // present되면 비디오 재생
        }
    }
    
    func setConstraints() {
        // playButton을 뷰에 추가
        view.addSubview(playButton)
        
        // playButton을 가운데 정렬
        NSLayoutConstraint.activate ([
            playButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            playButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }
    
}

 

2. ViewController에서 함수 실행 순서


ViewContoller는 다음 사진처럼 초기화(init)를 거쳐 뷰의 생명주기를 거친다.

위 코드는 player 변수의 값을 init 단계에서 설정했다.

 

 

3. init도 잘 골라 써야 한다


본 코드는 스토리보드 없이 코드로 작성되었으므로, 초기화 함수를 다음 두 가지 방법으로 작성할 수 있다.

그리고 required init도 함께 구현해주어야 한다.

 

(만약 스토리보드로 UI를 세팅했다면 아래 방법 대신 init(code:)를 사용해야 할 것이다... 아마도?)

(또는 designated init과 함께 convenience init을 활용할 수도 있다 (링크))

 

3-1. 2가지 방법

[방법 1]

init() {
    // AVPlayer 초기화
    player = AVPlayer(url: url)
    super.init(nibName: nil, bundle: nil)
}

 

[방법 2]

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    player = AVPlayer(url: url)
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

 

3-2. code base UI를 위한 세팅 (스토리보드 삭제)

위 코드가 제대로 실행되기 위해서는 스토리보드를 완전히 삭제해주어야 한다!

실제로 스토리보드를 삭제하지 않은 채 실행했더니 오류가 났다.

참고: Ted_iOS 블로그 (링크)

 

1. Main.storyboard 삭제

 

2. Project Targets > Build Settings > filter에 'main' 검색 > UIKit Main Storyboard File Base Name 삭제

 

3. Info.plist > StoryBoard name 삭제

 

4. 결과물

 

 

Todo


UIVIewController에 대한 apple 공식문서 읽기!

https://developer.apple.com/documentation/uikit/uiviewcontroller

 

UIViewController | Apple Developer Documentation

An object that manages a view hierarchy for your UIKit app.

developer.apple.com