diff --git a/PanBar/MenuBar/CarouselTickerView.swift b/PanBar/MenuBar/CarouselTickerView.swift index 1ef1e6b..f05dece 100644 --- a/PanBar/MenuBar/CarouselTickerView.swift +++ b/PanBar/MenuBar/CarouselTickerView.swift @@ -83,6 +83,10 @@ final class CarouselTickerView: NSView { displayLink = nil } + func invalidateAnimation() { + stopAnimation() + } + private func step(now: CFTimeInterval) { if items.count <= 1 { return diff --git a/PanBar/MenuBar/MenuBarTickerView.swift b/PanBar/MenuBar/MenuBarTickerView.swift index c51f069..a40d847 100644 --- a/PanBar/MenuBar/MenuBarTickerView.swift +++ b/PanBar/MenuBar/MenuBarTickerView.swift @@ -15,6 +15,8 @@ protocol MenuBarTickerView: NSView { var onContentChanged: (() -> Void)? { get set } /// 暂停动画(全市场休市 / 用户开关) func setPaused(_ paused: Bool) + /// view 被替换前停止内部动画源,避免旧 display link 的异步回调撞到新模式。 + func invalidateAnimation() /// 把当前状态画进 NSImage。size 跟 totalWidth × 22 一致。 func renderImage() -> NSImage } @@ -51,9 +53,11 @@ extension CarouselTickerView: MenuBarTickerView { extension CompactTickerView: MenuBarTickerView { func renderImage() -> NSImage { defaultRenderImage() } func setPaused(_ paused: Bool) {} // 无动画 + func invalidateAnimation() {} } extension MinimalTickerView: MenuBarTickerView { func renderImage() -> NSImage { defaultRenderImage() } func setPaused(_ paused: Bool) {} // 无动画 + func invalidateAnimation() {} } diff --git a/PanBar/MenuBar/StatusItemController.swift b/PanBar/MenuBar/StatusItemController.swift index e0d24f0..724df9e 100644 --- a/PanBar/MenuBar/StatusItemController.swift +++ b/PanBar/MenuBar/StatusItemController.swift @@ -107,6 +107,7 @@ final class StatusItemController { /// 通过 onContentChanged 回调把渲染好的 NSImage 设给 button.image。 private func swapTickerView(to mode: TickerDisplayMode) { tickerView.onContentChanged = nil + tickerView.invalidateAnimation() tickerView = Self.makeView(for: mode, scheme: prefs.colorScheme) wireUpTickerView() currentMode = mode diff --git a/PanBar/MenuBar/TickerView.swift b/PanBar/MenuBar/TickerView.swift index 8af47cb..1c475de 100644 --- a/PanBar/MenuBar/TickerView.swift +++ b/PanBar/MenuBar/TickerView.swift @@ -107,6 +107,10 @@ final class TickerView: NSView { displayLink = nil } + func invalidateAnimation() { + stopAnimation() + } + private func step(timestamp: CFTimeInterval) { defer { lastTimestamp = timestamp } if lastTimestamp == 0 { return }