İçeriğe geç

AVPlayerLayer ile video background

Merhabalar bu yazımda iOS ile uygulamalarınızda kayıt,giriş vb bölümlerinde arka fonda anlık olarak video nasıl oynatırız ? sorusunu cevaplayacağım.

Uygulamalarınızda sadece giriş,kayıt sayfalarında değil. Aynı zamanda tutorial sayfalarınızdada view üzerine eklediğiniz elementlerinizin altında oynayan video uygulamaya güzel bir görüntü ve değişiklik kazandırmakta. Bunun en güzel örneğini Spotify uygulamasını açtığımız zaman background üzerinde oynayan video ile görüyoruz. Bu görsel düzenlemeyi yapmak hiç zor değil.

AVPlayerLayer ile basit bir şekilde istediğiniz view üzerine layer olarak gömerek, videolarınızı oynatabilirsiniz. Daha sonrasında ise elementlerinizi normal bir şekilde viewiniz üzerine ekleyebilirsiniz.

Aşağıdaki kodu inceleyebilir ve deneyebilirsiniz.

import UIKit
import AVFoundation
import AVKit

class mainVC: UIViewController {
    
    let headerLabel:UILabel = {
        let label = UILabel()
        label.text = "Fly to dreams..."
        label.textColor = UIColor.black
        label.font = UIFont(name: "Avenir", size: 31)
        label.translatesAutoresizingMaskIntoConstraints = false
        label.layer.zPosition = 99
        label.textAlignment = .center
        label.shadowColor = UIColor.white
        label.shadowOffset = CGSize(width: 2, height: 1)
        return label
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(headerLabel)
        
        NSLayoutConstraint.activate([
            headerLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 40),
            headerLabel.leftAnchor.constraint(equalTo: self.view.leftAnchor),
            headerLabel.rightAnchor.constraint(equalTo: self.view.rightAnchor),
            headerLabel.heightAnchor.constraint(equalToConstant: 100)
            ])
        
        setupVideoView()
    }
    
    func setupVideoView() {
        
        guard let vidPath = Bundle.main.path(forResource: "vid", ofType: "mp4") else {
            return
        }

        let url = URL(fileURLWithPath: vidPath)
        let player = AVPlayer(url: url)
        
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.view.frame
        self.view.layer.addSublayer(playerLayer)
        playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
        
        player.play()
        player.actionAtItemEnd = .none
        
        NotificationCenter.default.addObserver(self, selector: #selector(videoDidPlay(_:)), name: NSNotification.Name("AVPlayerItemDidPlayToEndTimeNotification"), object: player.currentItem)
    }
    
    @objc func videoDidPlay(_ notification:Notification) {
        let player = notification.object as! AVPlayerItem
        player.seek(to: kCMTimeZero)
    }
    
    override var prefersStatusBarHidden: Bool {
        return true
    }
}//

Not: Bunun yanı sıra bilmeyenler için basit bir ipucu vereyim. Bundle.main.path işleminde bazen dosya uygulamanın içeririnde olsa bile nil döndürmekte. Bunun çözümü için Xcode üzerinden Targets + Build Phases + Copy Bundle Resources içerisinde dosyanın olup olmadığını kontrol edin yoksa buraya eklediğiniz takdirde sorunsuzca Bundle doğru path’i döndürecektir.

 

 

 

 

Tarih:iOS

Bu yazı yorumlara kapalı.

Copyright © 2020 Kenan Atmaca