Files
2025-12-05 22:16:55 +09:00

101 lines
3.5 KiB
Swift

import AVFoundation
import Charts
import HaishinKit
import SwiftUI
@available(iOS 17.0, *)
struct UVCView: View {
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
@EnvironmentObject var preference: PreferenceViewModel
@StateObject private var model = UVCViewModel()
var body: some View {
ZStack {
VStack {
if preference.viewType == .pip {
PiPHKViewRepresentable(previewSource: model)
} else {
MTHKViewRepresentable(previewSource: model)
}
}
VStack {
HStack(spacing: 16) {
Spacer()
Button(action: {
model.toggleRecording()
}, label: {
Image(systemName: model.isRecording ?
"recordingtape.circle.fill" :
"recordingtape.circle")
.resizable()
.scaledToFit()
.foregroundColor(.white)
.frame(width: 30, height: 30)
})
}
.frame(height: 50)
HStack {
Spacer()
Toggle(isOn: $model.isHDREnabled) {
Text("HDR")
}.frame(width: 120)
.pickerStyle(.segmented)
.frame(width: 150)
}.frame(height: 80)
Spacer()
HStack {
Spacer()
switch model.readyState {
case .connecting:
Spacer()
case .open:
Button(action: {
model.stopPublishing()
}, label: {
Image(systemName: "stop.circle")
.foregroundColor(.white)
.font(.system(size: 24))
})
.frame(width: 60, height: 60)
.background(Color.blue)
.cornerRadius(30.0)
.padding(EdgeInsets(top: 0, leading: 0, bottom: 16.0, trailing: 16.0))
case .closing:
Spacer()
case .closed:
Button(action: {
model.startPublishing(preference)
}, label: {
Image(systemName: "record.circle")
.foregroundColor(.white)
.font(.system(size: 24))
})
.frame(width: 60, height: 60)
.background(Color.blue)
.cornerRadius(30.0)
.padding(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 16.0))
}
}.frame(maxWidth: .infinity)
}
}
.onAppear {
model.startRunning(preference)
}
.onDisappear {
model.stopRunning()
}.alert(isPresented: $model.isShowError) {
Alert(
title: Text("Error"),
message: Text(String(describing: model.error)),
dismissButton: .default(Text("OK"))
)
}
}
}
#Preview {
if #available(iOS 17.0, *) {
UVCView()
}
}