From 7b3ecfffc59d2d980d9f7628365b64c20fe015be Mon Sep 17 00:00:00 2001 From: Runt <qingingrunt2010@qq.com> Date: Sun, 27 Jul 2025 09:42:03 +0000 Subject: [PATCH] 多个小窗缩放问题修复 --- LiveProject/activity/stream/LiveActivity.swift | 62 ++++++++++++++++++++++++++++--- 1 files changed, 56 insertions(+), 6 deletions(-) diff --git a/LiveProject/activity/stream/LiveActivity.swift b/LiveProject/activity/stream/LiveActivity.swift index 57e7890..3798276 100644 --- a/LiveProject/activity/stream/LiveActivity.swift +++ b/LiveProject/activity/stream/LiveActivity.swift @@ -25,6 +25,7 @@ DeviceInfo(name: "话筒", type: .MICROPHONE,deviceId: UUID().uuidString,icon: Icons.MIC), DeviceInfo(name: "系统", type: .SYSTEM,deviceId : UUID().uuidString,icon: Icons.PORTRAIT)] + @State private var miniWindows:Array<MiniWindowData> = [] @StateObject private var mViewModel = LiveViewModel() @@ -32,10 +33,21 @@ ZStack{ Color.clear .ignoresSafeArea() // 填满全屏 - VStack{ - VideoRendererView(pixelBuffer: $mViewModel.pixelBuffer).background(Color.black).frame(width: mainSize.width,height:mainSize.height) - Spacer() - }.border(Color.blue) + ZStack{ + let optionalIntBinding = Binding<Int?>( + get: { 0 }, + set: { newValue in } + ) + VideoRendererView(pixelBuffer: $mViewModel.pixelBuffer,rotate: optionalIntBinding).background(Color.black).frame(width: mainSize.width,height:mainSize.height) + .frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .topTrailing) + + }.border(Color.blue).clipped() + .overlay( + ForEach(miniWindows, id: \.id) { miniWindow in + NewMiniWindow(miniData: miniWindow) + } + ) + VStack{ Spacer() BottomBtns().frame(alignment: .bottom).border(Color.green) @@ -59,6 +71,7 @@ } }) .border(Color.red) + .clipped() .onDisappear { print("onDisappear 视图消失了!") @@ -152,12 +165,38 @@ ForEach(devices, id: \.self) { device in MButton(icon: device.icon,text: device.name){ - mViewModel.newWindowAction(device: device){ status in + var miniData = MiniWindowData(streamType: device.type); + switch device.type{ + case .CAMERA: + miniData.hasAudio = false; + miniData.hasVideo = true; + break; + case .MICROPHONE: + miniData.hasAudio = true; + miniData.hasVideo = false; + break; + case .VIDEO: + miniData.hasAudio = true; + miniData.hasVideo = true; + miniData.speakerState = .MUTE; + break; + case .PICTURE: + miniData.hasVideo = true; + miniData.hasAudio = false; + break; + default: + break + } + miniData.mainSize = mainSize + miniData.name = device.name; + mViewModel.newWindowAction(minidata: miniData){ status in withAnimation{ showDeviceDialog = false; } + + miniWindows.append(miniData); } - print("\(device.name) click") + print("\(device.name) \(device.type) click \(self.miniWindows.count)") } } } @@ -221,6 +260,17 @@ } } } + + func NewMiniWindow(miniData:MiniWindowData) -> some View{ + return MiniWindow(miniData: miniData) + .frame(maxWidth: .infinity,maxHeight: .infinity,alignment: .topLeading) + .onCloseClick { + guard let index = miniWindows.firstIndex(where: { $0.id == miniData.id }) else { return } + miniWindows.remove(at: index) + mViewModel.closeWindowAction(miniData: miniData) + } + } + } -- Gitblit v1.9.1