Toy Project/Netflix Style Application(iOS)

10. PlayerView

개발자킹콩 2021. 5. 2. 21:33

 

시작 전 PlayerViewController에 몇가지만 추가하자.

 

 

player을 추가하고 AVPlayer객체로 생성한다.

AVPlayer에 extension으로 compute property를 추가하는데 재생하고 있는지 여부를 판단하는 변수이다.

 

 

 

 


 

 

 

 

이제 실제 Player를 만들어 보자

 

우선 위의 코드를 살펴보면 변수 playerView의 경우 PlayerView!로 선언되어 있는데, 이는 Custom Class가 PlayerView로 지정되어 있어서 이다.

 

 

PlayerView의 경우 개발자 공식 홈페이지에서 가져온 코드이다.

우리는 AVPlayerLayer를 이용하기 위해 Custom Class를 지정한 것이었다.

 

developer.apple.com/documentation/avfoundation/avplayerlayer

 

Apple Developer Documentation

 

developer.apple.com

 

 

그렇다면 PlayerViewController에서 선언한 player가 PlayerView의 player라는 것을 지정해 줘야겠지

 

 

 


 

 

 

그리고 togglePlayButton에서는 playButton이 playing 상태에 따라 달라지도록 설정해야한다.

 

 

여기서 중요한 점은 AVPlayer은 클래스 이다. 즉 playerView.player에 player을 대입 시킨다는 것은 주소값을 공유하는 것이고 같은 것을 가리키고 있는 구조가 되는 것이다.

 

—> playerView.player의 상태를 보고 싶을때 player을 봐도 된다는 것을 의미한다. 그래서 isPlaying의 값을 playerView.player? 에서 판단하지 않고 player.isPlaying로 판단이 가능한 것이다.

 

이것은 오타인데 뒤에서 이를 수정한다. play()와 pause()의 위치를 바꿔야한다. 재생중으면 정지시켜야지~

 

 


 

 

 

그리고 play() 와 pause() 의 기능은 각각 다음과 같다.

재생/멈춤을 동작하고 playButton을 설정해주면 된다.

 

 

 


 

 

그리고 close로 playerView에서 나가게 될 때, reset()하는 작업도 필요하다.

멈추고 아이템 비우고 나가자!!

 

 

 

 

 


 

 

 

재생하는 기능은 거의 된거 같다. 그렇다면 이제 AVPlayer의 item을 넣어야 하는데 이를 구현해보자.

 

-> 이는 SearchViewController의 Delegate에서 item을 넘겨주도록 해야한다.

 

 

 

 

 

 

생각해보자!!

 

우리는 item이 필요하다!

근데 어떤 아이템? AVPlayerItem

왜? 미디어를 재생할때 AVPlayer()을 호출할껀데 이때 필요한 item이 AVPlayerItem 이니깐

 

우리는 indexPath.item으로 선택받은 데이터는 Movie라는 것을 알고있다.

그럼 Movie 의 데이터 중 재생에 필요한 데이터는 무엇을까? previewURL

 

그럼 우리는 previewURL을 이용해서 AVPlayerITem을 만들고 이를 PlayerView에 전달만 해주면 된다.

 

 

Movie.previewURL은 string이므로 URL객체로 만들어 버린다!!

왜? AVPlayerItem에는 url로 만들수 있기 때문이지

URL객체는 optional 로 되어 있는 것은 networking 할때 많이 경험 했을 것이다.

 

PlayerViewController을 가져왔다면 여기 안에는 player이 존재한다. 

그렇다면 AVPlayer에 currentItem을 집어 넣기만 하면 된다.

PlayerViewController이 viewDidLoad되면 player은 PlayerView.player와 같은 주소값을 가지도록 구현했기 때문이다.

 

 

 

 


 

 

 

 

여기서 간단한 오타 수정하고 가자.

 

 

화면이 등장해도 자동 재생이 되도록 설정하지 않았기 때문에 viewWillAppear에서 play()를 하도록 구현했다.

togglePlayButton에서 현재 재생중이면 정지하도록 구현해야하는데 반대로 지정해서 이를 수정했다.

 

 

 

 


 

 

 

 

Player에 해당하는 기능은 모두 구현했다.

검색결과로 토토로 한번 보고 가자

정상적으로 동작함을 알 수 있다.