Use native camera aspect ratio instead of forced 4:3

- Let MijickCamera determine the preview aspect ratio
- Ring light padding on horizontal sides (left/right)
- Smaller vertical padding between controls and camera
- Camera preview fills available space naturally
This commit is contained in:
Matt Bruce 2026-01-02 16:47:59 -06:00
parent 22586d6693
commit 7e5c4a021f

View File

@ -16,26 +16,12 @@ struct RingLightCameraScreen: MCameraScreen {
// MARK: - Layout Constants
/// Camera aspect ratio (4:3 for photos)
private let cameraAspectRatio: CGFloat = 4.0 / 3.0
/// Capture button inner padding
private let captureButtonInnerPadding: CGFloat = 8
/// Control bar height for layout calculations
private let controlBarHeight: CGFloat = 100
var body: some View {
GeometryReader { geometry in
let safeArea = geometry.safeAreaInsets
let availableWidth = geometry.size.width
let availableHeight = geometry.size.height
// Calculate camera size to fit within available space with ring padding
let cameraSize = calculateCameraSize(
availableWidth: availableWidth - (effectiveRingSize * 2),
availableHeight: availableHeight - (effectiveRingSize * 2) - controlBarHeight - safeArea.top
)
ZStack {
// Ring light background - fills entire screen
@ -47,50 +33,33 @@ struct RingLightCameraScreen: MCameraScreen {
// Top control bar
topControlBar
.padding(.top, safeArea.top + Design.Spacing.small)
.padding(.horizontal, Design.Spacing.large)
Spacer()
// Camera preview - centered with fixed aspect ratio
// Camera preview - uses native camera aspect ratio
// The ring light is the padding around it
createCameraOutputView()
.frame(width: cameraSize.width, height: cameraSize.height)
.clipShape(RoundedRectangle(cornerRadius: Design.CornerRadius.large))
.padding(.horizontal, effectiveRingSize)
.padding(.vertical, Design.Spacing.medium)
.overlay {
// Grid overlay on top of camera
if settings.isGridVisible {
GridOverlay(isVisible: true)
.clipShape(RoundedRectangle(cornerRadius: Design.CornerRadius.large))
.padding(.horizontal, effectiveRingSize)
.padding(.vertical, Design.Spacing.medium)
}
}
Spacer()
// Bottom control bar
bottomControlBar
.padding(.bottom, safeArea.bottom + Design.Spacing.medium)
.padding(.bottom, safeArea.bottom + Design.Spacing.small)
.padding(.horizontal, Design.Spacing.xLarge)
}
}
.ignoresSafeArea()
}
}
// MARK: - Camera Size Calculation
/// Calculates camera size maintaining aspect ratio within available space
private func calculateCameraSize(availableWidth: CGFloat, availableHeight: CGFloat) -> CGSize {
let targetWidth = availableWidth
let targetHeight = targetWidth * cameraAspectRatio
if targetHeight <= availableHeight {
// Width-constrained
return CGSize(width: targetWidth, height: targetHeight)
} else {
// Height-constrained
let height = availableHeight
let width = height / cameraAspectRatio
return CGSize(width: width, height: height)
}
}
// MARK: - Ring Size
private var effectiveRingSize: CGFloat {
@ -129,7 +98,6 @@ struct RingLightCameraScreen: MCameraScreen {
onSettingsTapped()
}
}
.padding(.horizontal, Design.Spacing.large)
}
// MARK: - Bottom Control Bar
@ -159,7 +127,6 @@ struct RingLightCameraScreen: MCameraScreen {
Color.clear
.frame(width: 44, height: 44)
}
.padding(.horizontal, Design.Spacing.xLarge)
}
// MARK: - Control Button Helper