83 lines
2.0 KiB
Swift
83 lines
2.0 KiB
Swift
//
|
|
// 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<PlayerView>) {
|
|
uiView.playerLayer.player = player
|
|
|
|
//Add player observer.
|
|
uiView.setObserver()
|
|
}
|
|
}
|