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