mirror of
https://github.com/HaishinKit/HaishinKit.swift.git
synced 2026-05-07 20:12:28 +00:00
101 lines
3.5 KiB
Swift
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()
|
|
}
|
|
}
|