refine iOS swipe flow interaction
This commit is contained in:
@@ -8,14 +8,24 @@ final class PlayerCoordinator: ObservableObject {
|
||||
|
||||
@Published var isPlaying = false
|
||||
@Published var playbackPositionMs: Int = 0
|
||||
@Published var playbackCompletionCount = 0
|
||||
|
||||
private var playbackEndObserver: NSObjectProtocol?
|
||||
|
||||
init() {
|
||||
self.player = AVPlayer()
|
||||
self.player.actionAtItemEnd = .pause
|
||||
}
|
||||
|
||||
deinit {
|
||||
if let playbackEndObserver {
|
||||
NotificationCenter.default.removeObserver(playbackEndObserver)
|
||||
}
|
||||
}
|
||||
|
||||
func prepareForPreview(url: URL, startTimeMs: Int = 0) {
|
||||
player.replaceCurrentItem(with: AVPlayerItem(url: url))
|
||||
observePlaybackEnd(for: player.currentItem)
|
||||
let startTime = CMTime(seconds: Double(startTimeMs) / 1_000.0, preferredTimescale: 1_000)
|
||||
player.seek(to: startTime)
|
||||
player.play()
|
||||
@@ -50,4 +60,26 @@ final class PlayerCoordinator: ObservableObject {
|
||||
func restart(url: URL, startTimeMs: Int = 0) {
|
||||
prepareForPreview(url: url, startTimeMs: startTimeMs)
|
||||
}
|
||||
|
||||
private func observePlaybackEnd(for item: AVPlayerItem?) {
|
||||
if let playbackEndObserver {
|
||||
NotificationCenter.default.removeObserver(playbackEndObserver)
|
||||
self.playbackEndObserver = nil
|
||||
}
|
||||
|
||||
guard let item else {
|
||||
return
|
||||
}
|
||||
|
||||
playbackEndObserver = NotificationCenter.default.addObserver(
|
||||
forName: .AVPlayerItemDidPlayToEndTime,
|
||||
object: item,
|
||||
queue: .main
|
||||
) { [weak self] _ in
|
||||
Task { @MainActor [weak self] in
|
||||
self?.isPlaying = false
|
||||
self?.playbackCompletionCount += 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user