// // PlayerUIView.swift // Werkout_ios // // Created by Trey Tartt on 7/5/23. // import SwiftUI import AVKit class PlayerUIView: UIView { // MARK: Class Property let playerLayer = AVPlayerLayer() // MARK: Init override init(frame: CGRect) { super.init(frame: frame) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } init(player: AVPlayer) { super.init(frame: .zero) self.playerSetup(player: player) } deinit { NotificationCenter.default.removeObserver(self) } // MARK: Life-Cycle override func layoutSubviews() { super.layoutSubviews() playerLayer.frame = bounds } // MARK: Class Methods private func playerSetup(player: AVPlayer) { playerLayer.player = player player.actionAtItemEnd = .none layer.addSublayer(playerLayer) self.setObserver() } func setObserver() { NotificationCenter.default.removeObserver(self) NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(notification:)), name: .AVPlayerItemDidPlayToEndTime, object: playerLayer.player?.currentItem) } @objc func playerItemDidReachEnd(notification: Notification) { if let playerItem = notification.object as? AVPlayerItem { playerItem.seek(to: .zero, completionHandler: nil) self.playerLayer.player?.play() } } } struct PlayerView: UIViewRepresentable { @Binding var player: AVPlayer func makeUIView(context: Context) -> PlayerUIView { return PlayerUIView(player: player) } func updateUIView(_ uiView: PlayerUIView, context: UIViewRepresentableContext) { uiView.playerLayer.player = player //Add player observer. uiView.setObserver() } }