From c17d6f174bd1d517a0eda8382bb462ad6924b5b8 Mon Sep 17 00:00:00 2001 From: Chris Date: Tue, 20 Oct 2026 14:22:27 -0700 Subject: [PATCH] ios: 1.0.15, mixer rows stretch to fill spare height Co-Authored-By: Claude Opus 5.5 --- ios/Stemify/UI/Screens/NowPlayingScreen.swift | 16 +++++++++++----- ios/project.yml | 4 ++-- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/ios/Stemify/UI/Screens/NowPlayingScreen.swift b/ios/Stemify/UI/Screens/NowPlayingScreen.swift index 035237c..f8da920 100644 --- a/ios/Stemify/UI/Screens/NowPlayingScreen.swift +++ b/ios/Stemify/UI/Screens/NowPlayingScreen.swift @@ -583,6 +583,9 @@ private struct MixerPanel: View { let pm = g.playback let names = pm.stemNames let stems = pm.source == .Stems + GeometryReader { geo in + // Spread spare height across the rows (stems + master) instead of leaving it all at the bottom. + let rowH = min(62, max(46, (geo.size.height - 80) / CGFloat(names.count + 1))) ScrollView { VStack(alignment: .leading, spacing: 0) { if pm.source == .Original { @@ -622,19 +625,20 @@ private struct MixerPanel: View { let levels = stems ? meters.step(pm.engine, names.count) : [] VStack(spacing: 0) { ForEach(Array(names.enumerated()), id: \.element) { i, name in - StemFader(name: name, setting: pm.mix[name] ?? StemSetting(), level: i < levels.count ? levels[i] : 0, enabled: stems) + StemFader(name: name, setting: pm.mix[name] ?? StemSetting(), level: i < levels.count ? levels[i] : 0, enabled: stems, height: rowH) } } } p.separator.frame(height: 0.5).padding(.vertical, 6) - FaderRow(dot: nil, label: "Master", percent: Int(pm.master * 100), dim: false) { + FaderRow(dot: nil, label: "Master", percent: Int(pm.master * 100), dim: false, height: rowH) { FaderSlider(value: pm.master, fill: p.label, onChange: pm.setMaster) } trailing: { EmptyView() } - Spacer(minLength: 12) + Spacer(minLength: 16) } .padding(.horizontal, 24) } .scrollIndicators(.hidden) + } } } @@ -665,12 +669,13 @@ private struct StemFader: View { let setting: StemSetting let level: Float let enabled: Bool + var height: CGFloat = 46 @Environment(\.palette) private var p private var pm: PlaybackManager { AppGraph.shared.playback } var body: some View { let color = Color(hex: Stems.color(name)) - FaderRow(dot: setting.muted ? p.label3 : color, label: Stems.label(name), percent: Int(stemTaper(setting.level) * 100), dim: setting.muted) { + FaderRow(dot: setting.muted ? p.label3 : color, label: Stems.label(name), percent: Int(stemTaper(setting.level) * 100), dim: setting.muted, height: height) { VStack(spacing: 0) { FaderSlider(value: setting.level, fill: setting.muted ? p.label3 : color, detent: StemSetting.unity, enabled: enabled) { pm.setStemLevel(name, $0) @@ -702,6 +707,7 @@ private struct FaderRow: View { let label: String let percent: Int let dim: Bool + var height: CGFloat = 46 @ViewBuilder let fader: Fader @ViewBuilder let trailing: Trailing @Environment(\.palette) private var p @@ -718,7 +724,7 @@ private struct FaderRow: View { .frame(width: 36, alignment: .trailing) trailing } - .frame(height: 46) + .frame(height: height) } } diff --git a/ios/project.yml b/ios/project.yml index 6171ba7..b0f0270 100644 --- a/ios/project.yml +++ b/ios/project.yml @@ -6,8 +6,8 @@ options: settings: base: SWIFT_VERSION: "5.0" - MARKETING_VERSION: "1.0.14" - CURRENT_PROJECT_VERSION: "15" + MARKETING_VERSION: "1.0.15" + CURRENT_PROJECT_VERSION: "16" targets: Stemify: type: application