From 65e5ec1716668dfbb92e5ae7b53079d7f9b1c02a Mon Sep 17 00:00:00 2001 From: cnliucheng Date: Thu, 6 Aug 2026 10:23:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=88=86=E5=8F=B7?= =?UTF-8?q?=E5=8A=A0=E7=B2=97=20+=20=E8=AE=BE=E7=BD=AE=E9=9D=A2=E6=9D=BF?= =?UTF-8?q?=E5=8F=AF=E5=8F=8D=E5=A4=8D=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - drawColon 圆点半径系数 0.06→0.12,分号分隔符明显加粗 - configureSheet 由“每次新建 controller”改为复用单个 lazy controller 的 window: 屏幕保护框架会缓存首次 configureSheet 返回的窗口引用,每次新建会导致关闭后 再次点击复用已隐藏的旧窗口而无反应(须重启“系统设置”才能再开);复用同一 window 使缓存引用始终有效、可反复 beginSheet --- FlipClockSaver/FlipClockSaver.swift | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/FlipClockSaver/FlipClockSaver.swift b/FlipClockSaver/FlipClockSaver.swift index 5b3cddd..bdc5581 100644 --- a/FlipClockSaver/FlipClockSaver.swift +++ b/FlipClockSaver/FlipClockSaver.swift @@ -336,7 +336,7 @@ final class FlipClockSaverView: ScreenSaverView { ctx.saveGState() ctx.setFillColor(textColor.cgColor) let cx = rect.midX - let r = min(rect.width, rect.height) * 0.06 + let r = min(rect.width, rect.height) * 0.12 for cy in [rect.minY + rect.height * 0.62, rect.minY + rect.height * 0.38] { ctx.fillEllipse(in: CGRect(x: cx - r, y: cy - r, width: r * 2, height: r * 2)) } @@ -410,15 +410,13 @@ final class FlipClockSaverView: ScreenSaverView { // MARK: 设置面板 override var hasConfigureSheet: Bool { true } - // 持久保留所有 controller:NSControl.target 是弱引用, - // controller 一旦释放,已显示窗口里的滑杆/按钮就会失去响应 - private var configControllers: [FlipClockConfigController] = [] + // 复用同一个 controller/window:每次点“选项”框架都会重新调用 configureSheet, + // 返回同一个已存在的 window 即可反复弹出。若每次都新建,框架缓存的仍是首个窗口, + // 关掉后再次点击会复用那个已 endSheet 隐藏的旧窗口而无反应(只能重启“系统设置”才能再开)。 + private lazy var configController: FlipClockConfigController = FlipClockConfigController() override var configureSheet: NSWindow? { - // 每次打开都新建窗口:避免窗口被关闭后无法再次弹出 - let controller = FlipClockConfigController() - controller.reloadValues() - configControllers.append(controller) - return controller.window + configController.reloadValues() + return configController.window } @objc private func handleSettingsChanged(_ note: Notification) {