From bf9e4680eb466bcb7c9cb1bef567252bb1f2bb7d Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Fri, 27 Jun 2025 05:32:55 +0000 Subject: [PATCH] 1 --- LiveProject/activity/stream/LiveActivity.swift | 128 ++++++++++++++++++++++++++++++++++++++---- 1 files changed, 116 insertions(+), 12 deletions(-) diff --git a/LiveProject/activity/stream/LiveActivity.swift b/LiveProject/activity/stream/LiveActivity.swift index d6faae2..8f16308 100644 --- a/LiveProject/activity/stream/LiveActivity.swift +++ b/LiveProject/activity/stream/LiveActivity.swift @@ -7,21 +7,121 @@ import Foundation import SwiftUI +import WrappingHStack struct LiveActivity: View { + @State private var pixelBuffer: CVPixelBuffer? + + + @State private var showDeviceDialog = false + + @State private var streamRate = Float(9/16.0); + @State private var mainSize: CGSize = .init(width: 100, height: 100) + + @State private var devices = [DeviceInfo(name: "相机", type: .CAMERA(), deviceId: "相机"), + DeviceInfo(name: "话筒", type: .MICROPHONE(),deviceId: "话筒"), + DeviceInfo(name: "系统", type: .SYSTEM(),deviceId : "系统")] + var body: some View { - NavigationView{ - ZStack{ + ZStack{ + Color.clear + .ignoresSafeArea() // 填满全屏 + VStack{ + VideoRendererView(renderer: MetalRenderer()).background(Color.black).frame(width: mainSize.width,height:mainSize.height) + Spacer() + }.border(Color.blue) + VStack{ + Spacer() + BottomBtns().frame(alignment: .bottom).border(Color.green) + } + if showDeviceDialog { + DialogDevices() + } + }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading) + .background( + GeometryReader { geometry in + Color.clear + .onAppear { + updateWindowSize(width: Int(geometry.size.width), height: Int(geometry.size.height)) + } + .onChange(of: geometry.size) { newSize in + updateWindowSize(width: Int(newSize.width), height: Int(newSize.height)) + } + }) + .border(Color.red) + .onDisappear { + print("onDisappear 视图消失了!") + }.onAppear { + print("onAppear 视图出现了!") + } + } + + func updateWindowSize(width:Int,height:Int){ + var rate : Float = Float(width)/Float(height); + if(rate != streamRate) { + var mainWidth = 0; + var mainHeight = 0; + if(rate < streamRate){ + mainWidth = width; + if(9.0/16 == streamRate){ + mainHeight = (mainWidth / 9 * 16); + }else{ + mainHeight = (mainWidth / 16 * 9); + } + }else{ + mainHeight = height; + if(9.0 / 16 == streamRate){ + mainWidth = (mainHeight / 16 * 9); + }else{ + mainWidth = (mainHeight / 9 * 16); + } + } + if(mainSize.width != CGFloat(mainWidth) || mainSize.height != CGFloat(mainHeight)){ + mainSize = .init(width: mainWidth, height: mainHeight); + } + }else{ + if(mainSize.width != CGFloat(width) || mainSize.height != CGFloat(height)){ + mainSize = .init(width: width, height: height); } } + //Log.w(TAG , "onSizeChanged: ${mainWindowSize.value}" , ) } -} - -struct Bottombtns:View { - var body: some View { + + func DialogDevices() -> some View{ + ZStack{ + Color.black.opacity(0.4) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + withAnimation { + showDeviceDialog = false + } + } + VStack { + Spacer() + VStack(spacing: 20) { + Spacer().frame(height:40) + FlowLayout(devices){ device in + MButton(text:device.name){ + + } + } + .padding() + .animation(.default, value: devices) + } + .frame(maxWidth: .infinity) + .padding() + .background(Color.white) + .cornerRadius(20) + .transition(.move(edge: .bottom)) + } + .zIndex(1) + } + } + + func BottomBtns() -> some View{ VStack{ - + HStack(){ MButton(icon: IconPortrait()){ @@ -35,14 +135,17 @@ } HStack{ LButton(text: "设备"){ - + print("Click 设备 button") + withAnimation{ + showDeviceDialog.toggle() + } } LButton(text: "RTMP"){ } - LButton(text: "文件"){ + /*flLButton(text: "文件"){ - } + }*/ LButton(text: "文本"){ } @@ -56,9 +159,10 @@ } } -struct LiveActivity_Previews: PreviewProvider{ + +struct LiveActivity_BottomBtns_Previews: PreviewProvider{ static var previews: some View { - Bottombtns(); + LiveActivity(); } } -- Gitblit v1.9.1