refine iOS swipe flow interaction

This commit is contained in:
2026-04-10 11:25:42 +02:00
parent a4d77078a4
commit 392116bf28
6 changed files with 150 additions and 41 deletions
@@ -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
}
}
}
}