77 lines
2.7 KiB
Swift
77 lines
2.7 KiB
Swift
// 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()
|
||
}
|
||
}
|