// MARK: - Media Overlay View import SwiftUI import AVKit struct MediaOverlayView: View { @Binding var videoPlayer: AVPlayer? @Binding var showControls: Bool let mediaType: BlindBoxMediaType let displayImage: UIImage? let scaledWidth: CGFloat let scaledHeight: CGFloat let scale: CGFloat let videoURL: String let imageURL: String let blindGenerate: BlindBoxData? let onBackTap: () -> Void var body: some View { ZStack { VisualEffectView(effect: UIBlurEffect(style: .systemUltraThinMaterialLight)) .opacity(0.3) .edgesIgnoringSafeArea(.all) Group { if mediaType == .video, let player = videoPlayer { AVPlayerController(player: $videoPlayer) .frame(width: scaledWidth, height: scaledHeight) .opacity(scale == 1 ? 1 : 0.7) .onAppear { player.play() } } else if mediaType == .image, let image = displayImage { Image(uiImage: image) .resizable() .scaledToFit() .frame(width: scaledWidth, height: scaledHeight) .opacity(scale == 1 ? 1 : 0.7) } } .onTapGesture { withAnimation(.easeInOut(duration: 0.1)) { showControls.toggle() } } // 返回按钮 if showControls { VStack { HStack { Button(action: onBackTap) { Image(systemName: "chevron.left") .font(.system(size: 24)) .foregroundColor(.black) } Spacer() } Spacer() } .frame(maxWidth: .infinity, maxHeight: .infinity) .padding(.top, 50) .padding(.leading, 20) .zIndex(1000) .transition(.opacity) .onAppear { // 2秒后显示按钮 DispatchQueue.main.asyncAfter(deadline: .now() + 2) { withAnimation(.easeInOut(duration: 0.3)) { // 这里应该设置 showControls = true,但由于是绑定,我们假设调用方会处理 } } } } } .frame(maxWidth: .infinity, maxHeight: .infinity) .animation(.easeInOut(duration: 1.0), value: scale) .ignoresSafeArea() } }