diff --git a/DynamicIsland/components/Settings/SettingsView.swift b/DynamicIsland/components/Settings/SettingsView.swift index a5c5e66..d14e0b0 100644 --- a/DynamicIsland/components/Settings/SettingsView.swift +++ b/DynamicIsland/components/Settings/SettingsView.swift @@ -4457,6 +4457,7 @@ private struct LockScreenGlassVariantPreviewCell: View { private let cornerRadius: CGFloat = 16 private let previewCornerRadius: CGFloat = 14 private let previewSize = CGSize(width: 190, height: 96) + @State private var previewToken: Double = 0 var body: some View { ZStack { @@ -4478,22 +4479,28 @@ private struct LockScreenGlassVariantPreviewCell: View { ) .padding(.vertical, 6) .allowsHitTesting(false) + .onAppear { + Logger.log("Lock screen glass preview appeared (variant v\(variant.rawValue))", category: .performance) + } + .onDisappear { + Logger.log("Lock screen glass preview disappeared", category: .performance) + } + .onChange(of: variant) { _, newValue in + previewToken = Date().timeIntervalSinceReferenceDate + Logger.log("Lock screen glass preview variant changed to v\(newValue.rawValue)", category: .performance) + } } private var liquidGlassPreview: some View { - TimelineView(.periodic(from: .now, by: 1.0 / 30.0)) { context in - let phase = context.date.timeIntervalSinceReferenceDate.truncatingRemainder(dividingBy: 1.0) - let opacityJitter = phase < 0.5 ? 1.0 : 0.999999 - LiquidGlassBackground( - variant: variant, - cornerRadius: previewCornerRadius, - trigger: context.date.timeIntervalSinceReferenceDate - ) { - Color.white.opacity(0.04) - } - .frame(width: previewSize.width, height: previewSize.height) - .opacity(opacityJitter) + LiquidGlassBackground( + variant: variant, + cornerRadius: previewCornerRadius, + trigger: previewToken, + jitterEnabled: false + ) { + Color.white.opacity(0.04) } + .frame(width: previewSize.width, height: previewSize.height) .shadow(color: Color.black.opacity(0.2), radius: 10, x: 0, y: 6) } } diff --git a/DynamicIsland/helpers/LiquidGlassBackground.swift b/DynamicIsland/helpers/LiquidGlassBackground.swift index 65cc214..2af27bb 100644 --- a/DynamicIsland/helpers/LiquidGlassBackground.swift +++ b/DynamicIsland/helpers/LiquidGlassBackground.swift @@ -58,6 +58,7 @@ public struct LiquidGlassBackground: NSViewRepresentable { private let cornerRadius: CGFloat private let variant: LiquidGlassVariant private let trigger: Double + private let jitterEnabled: Bool /// Creates a new liquid‑glass container. /// - Parameters: /// - variant: Any ``LiquidGlassVariant`` (0–19). Defaults to `.v11`, which is visually super pleasing @@ -67,11 +68,13 @@ public struct LiquidGlassBackground: NSViewRepresentable { variant: LiquidGlassVariant = .defaultVariant, cornerRadius: CGFloat = 10, trigger: Double = 0, + jitterEnabled: Bool = true, @ViewBuilder content: () -> Content ) { self.variant = variant self.cornerRadius = cornerRadius self.trigger = trigger + self.jitterEnabled = jitterEnabled self.content = content() } @@ -146,9 +149,13 @@ public struct LiquidGlassBackground: NSViewRepresentable { nsView.setValue(cornerRadius, forKey: "cornerRadius") callPrivateVariantSetter(on: nsView, value: variant.rawValue) - // Micro-jitter: imperceptibly adjust opacity so WindowServer re-samples the wallpaper every frame. - let jitter = sin(trigger * 100) * 0.000001 - nsView.alphaValue = 1.0 - CGFloat(abs(jitter)) + if jitterEnabled { + // Micro-jitter: imperceptibly adjust opacity so WindowServer re-samples the wallpaper every frame. + let jitter = sin(trigger * 100) * 0.000001 + nsView.alphaValue = 1.0 - CGFloat(abs(jitter)) + } else if nsView.alphaValue != 1.0 { + nsView.alphaValue = 1.0 + } nsView.needsDisplay = true }