From d8904f4acbbebab5af984cff0ba80fd43d873d3f Mon Sep 17 00:00:00 2001 From: vgearen Date: Thu, 14 May 2026 11:30:52 +0800 Subject: [PATCH] fix(ui): match settings height to list mode + CI uses latest Xcode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI fix (SDK-agnostic): - SettingsView height 480 → 620 so the settings mode panel size matches list mode at maximum. Avoids MenuBarExtra's NSPanel not shrinking when switching between list and settings views. - Drop the .id(showSettings) hack — it forced view rebuild but the panel is managed by AppKit and does not respond to SwiftUI view recreation. CI hardening: - Use maxim-lobanov/setup-xcode@v1 with latest-stable so the runner Xcode is as close to local (Xcode 26.5) as available, minimizing SwiftUI SDK behavior drift. - Run xcodebuild test before building the DMG; release will fail-fast on test regressions instead of shipping broken binaries. Root cause analysis of v1.3.4 regression: Local Xcode 26.5 produced a 5.2MB binary linking to macOS 26 SwiftUI symbols; GH macos-latest with default Xcode 16 produced a 5.0MB binary linking to macOS 15 SwiftUI. The .id() hack happened to look correct in the SDK 26 build but not in SDK 15 — same source, different runtime behavior. The height:620 approach works in both. --- .github/workflows/release.yml | 24 ++++++++++++++++++++++-- StockMonitor.xcodeproj/project.pbxproj | 8 ++++---- StockMonitor/Views/DropdownView.swift | 1 - StockMonitor/Views/SettingsView.swift | 4 +++- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fc948e7..1975bbf 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,14 +10,34 @@ permissions: jobs: build: + # runs-on 取最新可用,setup-xcode 选 latest-stable,尽量接近本地 SDK。 + # SwiftUI(特别是 MenuBarExtra panel)在不同 SDK 下行为不一致 —— + # CI 用旧 SDK 编译会导致用户实际使用时 UI 异常(如 v1.3.4 设置页空白)。 runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v4 - - name: Select Xcode - run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer + - name: Setup Xcode (latest-stable) + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: latest-stable + + - name: Show toolchain + run: | + xcodebuild -version + xcodebuild -showsdks | grep -i macos | head -5 + + - name: Run Tests + run: | + xcodebuild test \ + -project StockMonitor.xcodeproj \ + -scheme Stockbar \ + -destination 'platform=macOS,arch=arm64' \ + CODE_SIGN_IDENTITY="-" \ + CODE_SIGNING_REQUIRED=NO \ + CODE_SIGNING_ALLOWED=NO - name: Build Universal Binary run: | diff --git a/StockMonitor.xcodeproj/project.pbxproj b/StockMonitor.xcodeproj/project.pbxproj index 72782e1..36b939d 100644 --- a/StockMonitor.xcodeproj/project.pbxproj +++ b/StockMonitor.xcodeproj/project.pbxproj @@ -339,7 +339,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 13.5; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.3.5; PRODUCT_BUNDLE_IDENTIFIER = com.vgearen.Stockbar; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -373,7 +373,7 @@ "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 13.5; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.3.5; PRODUCT_BUNDLE_IDENTIFIER = com.vgearen.Stockbar; PRODUCT_NAME = "$(TARGET_NAME)"; REGISTER_APP_GROUPS = YES; @@ -393,7 +393,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.3.5; PRODUCT_BUNDLE_IDENTIFIER = com.vgearen.StockbarTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; @@ -412,7 +412,7 @@ CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.3.4; + MARKETING_VERSION = 1.3.5; PRODUCT_BUNDLE_IDENTIFIER = com.vgearen.StockbarTests; PRODUCT_NAME = "$(TARGET_NAME)"; STRING_CATALOG_GENERATE_SYMBOLS = NO; diff --git a/StockMonitor/Views/DropdownView.swift b/StockMonitor/Views/DropdownView.swift index 68630ec..a3e1f76 100644 --- a/StockMonitor/Views/DropdownView.swift +++ b/StockMonitor/Views/DropdownView.swift @@ -105,6 +105,5 @@ struct DropdownView: View { .frame(width: 320) .fixedSize(horizontal: false, vertical: true) .background(Color(nsColor: .windowBackgroundColor)) - .id(showSettings) } } diff --git a/StockMonitor/Views/SettingsView.swift b/StockMonitor/Views/SettingsView.swift index 9055ac8..310d57e 100644 --- a/StockMonitor/Views/SettingsView.swift +++ b/StockMonitor/Views/SettingsView.swift @@ -258,7 +258,9 @@ struct SettingsView: View { .padding(8) } .scrollIndicators(.never) - .frame(width: 284, height: 480) + // 高度与列表模式(ProfitSummary + stockListView maxHeight 520 + Toolbar 等)相当, + // 避免切换 list↔settings 时 NSPanel 大小不一致导致下方空白。 + .frame(width: 284, height: 620) } // MARK: - 排序辅助