Today’s Goal

  1. Learn LBTA Youtube ep 16
  2. Swift, Optional과 Optional Binding

LBTA Youtube ep 16

How to play Video with Animation using AVPlayer

Video Cell을 클릭하면 Video를 볼 수 있게하자.

FeedCell.swift에서 didSelect함수를 호출 (HomeController는 전체 collectionView에 관여)

새롭게 나올 View를 담당할 VideoLauncher.swift를 Helpers group에 추가

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let videoLauncher = VideoLauncher()
        videoLauncher.showVideoPlayer()
    }

NSObject를 상속한 VideoLauncher는 UIView 요소에 접근할 수 없다.

그래서 keyWindow를 통해 접근할 것이다.

class VideoLauncher: NSObject {
    func showVideoPlayer() {
        print("Show Video Player Animation...")
        
        if let keyWindow = UIApplication.shared.keyWindow {
            let view = UIView(frame: keyWindow.frame)
            view.backgroundColor = UIColor.white
            
            keyWindow.addSubview(view)
        }
    }

keyWindow를 Optional Binding하여 keyWindow에 view를 keyWindow의 subview로 추가한다.

아마 keyWindow는 현재 화면인듯 하다.

Video Player Animation

애니메이션을 추가하기 위해서는

Beginning frame - Ending frame을 생각하자

// Beginning frame
view.frame = CGRect(x: keyWindow.frame.width - 30, y: keyWindow.frame.height - 30, width: 30, height: 30)

// Ending frame with animation
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                
                view.frame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: keyWindow.frame.height)
                
            }) { (completedAnimation) in
                // Hide Status Bar
//                let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
//                statusBar.isHidden = true
            }

위 코드는 모두 keyWindow optional binding 내부

a.k.a animateDamping을 호출하여 animations: 부분에서 enter를 치고 ending frame을 입력한다.

+) 그리고 UIView는 항상 frame이 있어야 눈에 보인다.

completedAnimation에 있는 코드는 status bar를 보이지 않게 해주는 코드

####Video Player View

Video를 play할 부분의 view의 클래스를 따로 만들어준다.

담아야할 정보가 꽤 있기 때문에

class VideoPlayerView: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        backgroundColor = .black
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

keyWindow optional binding block 안

			let statusBarHeight: CGFloat = 40
            let statusBarBackgroundView = UIView()
            statusBarBackgroundView.backgroundColor = .blue
            statusBarBackgroundView.frame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: statusBarHeight)
            view.addSubview(statusBarBackgroundView)
            
            // 16 : 9 is the aspect ratio of all HD videos
            let height = keyWindow.frame.width * 9 / 16
            let videoPlayerFrame = CGRect(x: 0, y: statusBarHeight, width: keyWindow.frame.width, height: height)
            let videoPlayerView = VideoPlayerView(frame: videoPlayerFrame)
            
            view.addSubview(videoPlayerView)

iPhoneXr simulator여서 status bar를 숨길 필요가 없고 오히려 40의 간격을 줘야하기 때문에

statusBarBackgroundView를 만들어서 추가했다.

videoPlayerFrame은 16:9로 맞춰준다.

AVPlayer

import AVFoundation

class VideoPlayerView: UIView {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        backgroundColor = .black
        
        let urlString = "https://firebasestorage.googleapis.com/v0/b/gameofchats-762ca.appspot.com/o/message_movies%2F12323439-9729-4941-BA07-2BAE970967C7.mov?alt=media&token=3e37a093-3bc8-410f-84d3-38332af9c726"
        
        if let url = NSURL(string: urlString) {
            let player = AVPlayer(url: url as URL)

            let playerLayer = AVPlayerLayer(player: player)
            
            self.layer.addSublayer(playerLayer)
            playerLayer.frame = self.frame

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

AVFoundation을 import하고

AVPlayerLayer frame까지 설정을 해줘야 정상적으로 play된다.

태그:

카테고리:

업데이트:

댓글남기기