From 9df2ddb80ba8abfd35661d6926ba5ec69ae4157a Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 13 Aug 2026 18:08:25 +0200 Subject: [PATCH] =?UTF-8?q?Akku-Popover:=20=E2=80=9EL=C3=A4dt"=20sitzt=20a?= =?UTF-8?q?uf=20der=20H=C3=B6he=20des=20Rings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ein HStack zentriert über die volle Höhe seiner Inhalte. Die Beschriftung unter dem Ring gehört dazu, also rutschte alles daneben um deren halbe Höhe nach unten. Bei drei Zeilen fällt das kaum auf, bei einer einzelnen schon: „Lädt" stand sichtbar tiefer als die Mitte, auf die man schaut. Eine eigene Ausrichtung löst das an der Stelle, an der es entsteht: der Ring meldet seine Mitte, die Spalte daneben richtet sich danach — unabhängig davon, wie viele Zeilen sie hat. Co-Authored-By: Claude Opus 5 --- .../MetricsProvider/MetricPopovers.swift | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Packages/OnyxKit/Sources/MetricsProvider/MetricPopovers.swift b/Packages/OnyxKit/Sources/MetricsProvider/MetricPopovers.swift index 10bf311..07d3c34 100644 --- a/Packages/OnyxKit/Sources/MetricsProvider/MetricPopovers.swift +++ b/Packages/OnyxKit/Sources/MetricsProvider/MetricPopovers.swift @@ -61,6 +61,21 @@ private struct Row: View { } } +/// Die Mitte des **Rings** — nicht die des Rings samt Beschriftung. +/// +/// Ein `HStack` zentriert seine Inhalte über die volle Höhe. Die Beschriftung +/// unter dem Ring gehört aber dazu, und dadurch rutscht alles daneben um deren +/// halbe Höhe nach unten. Bei einer einzelnen Zeile fällt das auf: sie steht +/// dann sichtbar tiefer als die Mitte, auf die man schaut. +private extension VerticalAlignment { + enum DialCenterID: AlignmentID { + static func defaultValue(in context: ViewDimensions) -> CGFloat { + context[VerticalAlignment.center] + } + } + static let dialCenter = VerticalAlignment(DialCenterID.self) +} + /// Ein Ring mit Zahl in der Mitte. private struct Dial: View { let value: Double @@ -81,6 +96,7 @@ private struct Dial: View { Text(text).font(.system(size: 15, weight: .medium).monospacedDigit()) } .frame(width: 62, height: 62) + .alignmentGuide(.dialCenter) { $0[VerticalAlignment.center] } Text(caption).font(.caption2).foregroundStyle(.secondary) } .padding(.bottom, 2) @@ -244,7 +260,7 @@ private struct BatteryDetail: View { var body: some View { if let battery = snapshot.battery { - HStack(spacing: 14) { + HStack(alignment: .dialCenter, spacing: 14) { Dial(value: battery.charge, caption: String(localized: "metric.battery", bundle: .module), text: MetricFormat.percent(battery.charge), @@ -275,6 +291,7 @@ private struct BatteryDetail: View { // Ladestand stehen bleibt. activityLine(battery) } + .alignmentGuide(.dialCenter) { $0[VerticalAlignment.center] } } // Das Ladelimit steht hier und nicht in den Einstellungen: es ist