Add Center Stage support alongside MijickCamera
Center Stage is a device-level Apple feature that works independently of any camera framework. Added: - Center Stage button in top control bar (person.crop.rectangle icon) - checkCenterStageAvailability() checks device.activeFormat.isCenterStageSupported - toggleCenterStage() uses AVCaptureDevice.isCenterStageEnabled - Button only appears on devices that support Center Stage - Yellow highlight when enabled Works with MijickCamera since Center Stage is controlled at the AVCaptureDevice level, not the camera view level.
This commit is contained in:
parent
489318b220
commit
b97590f1c1
@ -2,6 +2,7 @@ import SwiftUI
|
|||||||
import MijickCamera
|
import MijickCamera
|
||||||
import Bedrock
|
import Bedrock
|
||||||
import Photos
|
import Photos
|
||||||
|
import AVFoundation
|
||||||
|
|
||||||
struct ContentView: View {
|
struct ContentView: View {
|
||||||
@State private var settings = SettingsViewModel()
|
@State private var settings = SettingsViewModel()
|
||||||
@ -15,6 +16,10 @@ struct ContentView: View {
|
|||||||
@State private var capturedVideoURL: URL?
|
@State private var capturedVideoURL: URL?
|
||||||
@State private var showPostCapturePreview = false
|
@State private var showPostCapturePreview = false
|
||||||
|
|
||||||
|
// Center Stage support
|
||||||
|
@State private var isCenterStageAvailable = false
|
||||||
|
@State private var isCenterStageEnabled = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
GeometryReader { geometry in
|
GeometryReader { geometry in
|
||||||
let maxRingSize = calculateMaxRingSize(for: geometry)
|
let maxRingSize = calculateMaxRingSize(for: geometry)
|
||||||
@ -65,6 +70,9 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.ignoresSafeArea()
|
.ignoresSafeArea()
|
||||||
|
.onAppear {
|
||||||
|
checkCenterStageAvailability()
|
||||||
|
}
|
||||||
.sheet(isPresented: $showPaywall) {
|
.sheet(isPresented: $showPaywall) {
|
||||||
ProPaywallView()
|
ProPaywallView()
|
||||||
}
|
}
|
||||||
@ -86,6 +94,22 @@ struct ContentView: View {
|
|||||||
|
|
||||||
private var topControlBar: some View {
|
private var topControlBar: some View {
|
||||||
HStack {
|
HStack {
|
||||||
|
// Center Stage button (only shown when available)
|
||||||
|
if isCenterStageAvailable {
|
||||||
|
Button {
|
||||||
|
toggleCenterStage()
|
||||||
|
} label: {
|
||||||
|
Image(systemName: isCenterStageEnabled ? "person.crop.rectangle.fill" : "person.crop.rectangle")
|
||||||
|
.font(.body)
|
||||||
|
.foregroundStyle(isCenterStageEnabled ? .yellow : .white)
|
||||||
|
.padding(Design.Spacing.small)
|
||||||
|
.background(.ultraThinMaterial, in: Circle())
|
||||||
|
}
|
||||||
|
.accessibilityLabel(String(localized: "Center Stage"))
|
||||||
|
.accessibilityValue(isCenterStageEnabled ? "On" : "Off")
|
||||||
|
.accessibilityHint(String(localized: "Keeps you centered in frame"))
|
||||||
|
}
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
// Grid toggle
|
// Grid toggle
|
||||||
@ -115,6 +139,28 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Center Stage
|
||||||
|
|
||||||
|
/// Checks if Center Stage is available on this device
|
||||||
|
private func checkCenterStageAvailability() {
|
||||||
|
// Center Stage requires a compatible device (iPad with A12+ or some iPhones)
|
||||||
|
guard let device = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .front) else {
|
||||||
|
isCenterStageAvailable = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the device supports Center Stage
|
||||||
|
isCenterStageAvailable = device.activeFormat.isCenterStageSupported
|
||||||
|
isCenterStageEnabled = AVCaptureDevice.isCenterStageEnabled
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Toggles Center Stage on/off
|
||||||
|
private func toggleCenterStage() {
|
||||||
|
AVCaptureDevice.centerStageControlMode = .app
|
||||||
|
AVCaptureDevice.isCenterStageEnabled.toggle()
|
||||||
|
isCenterStageEnabled = AVCaptureDevice.isCenterStageEnabled
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Post Capture View
|
// MARK: - Post Capture View
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user