diff --git a/DynamicIsland/components/Notch/NotchHomeView.swift b/DynamicIsland/components/Notch/NotchHomeView.swift index 31a88e4..c494630 100644 --- a/DynamicIsland/components/Notch/NotchHomeView.swift +++ b/DynamicIsland/components/Notch/NotchHomeView.swift @@ -97,6 +97,7 @@ struct AlbumArtView: View { struct MusicControlsView: View { @ObservedObject var musicManager = MusicManager.shared + @EnvironmentObject var vm: DynamicIslandViewModel @State private var sliderValue: Double = 0 @State private var dragging: Bool = false @State private var lastDragged: Date = .distantPast @@ -108,6 +109,16 @@ struct MusicControlsView: View { } .buttonStyle(PlainButtonStyle()) .frame(minWidth: Defaults[.showMirror] && Defaults[.showCalendar] ? 140 : 180) + .onAppear { + // Initialize slider value when view appears + sliderValue = musicManager.elapsedTime + } + .onChange(of: vm.notchState) { _, newState in + // Reset slider value when notch opens to prevent stuck state + if newState == .open && !dragging { + sliderValue = musicManager.elapsedTime + } + } } private var songInfoAndSlider: some View { @@ -137,7 +148,7 @@ struct MusicControlsView: View { } private var musicSlider: some View { - TimelineView(.animation(minimumInterval: musicManager.playbackRate > 0 ? 0.1 : nil)) { timeline in + TimelineView(.animation(minimumInterval: 0.05)) { timeline in MusicSliderView( sliderValue: $sliderValue, duration: $musicManager.songDuration, @@ -278,7 +289,7 @@ struct MusicSliderView: View { var currentElapsedTime: Double { // A small buffer is needed to ensure a meaningful difference between the two dates - guard !dragging, timestampDate.timeIntervalSince(lastDragged) > -0.0001, (timestampDate > lastUpdated || ignoreLastUpdated) else { return sliderValue } + guard !dragging, timestampDate.timeIntervalSince(lastDragged) > -1 else { return sliderValue } let timeDifference = isPlaying ? currentDate.timeIntervalSince(timestampDate) : 0 let elapsed = elapsedTime + (timeDifference * playbackRate) return min(elapsed, duration) diff --git a/DynamicIsland/managers/MusicManager.swift b/DynamicIsland/managers/MusicManager.swift index cf141ca..16bb793 100644 --- a/DynamicIsland/managers/MusicManager.swift +++ b/DynamicIsland/managers/MusicManager.swift @@ -274,7 +274,17 @@ class MusicManager: ObservableObject { self.repeatMode = state.repeatMode } - self.timestampDate = state.lastUpdated + // Update timestamp - use current time if state doesn't provide recent timestamp + let stateTimestamp = state.lastUpdated + let now = Date() + + // If the state timestamp is very recent (within 1 second), use it + // Otherwise, use current time for better real-time calculation + if abs(stateTimestamp.timeIntervalSince(now)) < 1.0 { + self.timestampDate = stateTimestamp + } else { + self.timestampDate = now + } } // Execute the batch update on the main thread