我正在努力实现一个用AVKit制作的动态视频播放器中的点击手势.我打算让视频在提要(这是一个社交媒体应用程序)中观看时,视频在没有声音的情况下播放.点击一次视频就会有声音,点击两次视频就会全屏显示.
目前,单塔工程.但是,除非我点击视频的右上角,否则不会检测到双击.
import SwiftUI
import AVKit
struct VideoPlayerView: View {
@StateObject private var viewModel: VideoPlayerViewModel
init(url: URL, isFeedView: Bool = true) {
_viewModel = StateObject(wrappedValue: .init(url: url, isFeedView: isFeedView))
}
var body: some View {
ZStack {
if let player: AVPlayer = viewModel.player {
VideoPlayer(player: player)
.onAppear {
// Start playing or resume from the last known position if in feed view
if viewModel.isFeedView {
if let lastKnownTime = viewModel.lastKnownTime {
player.seek(to: CMTime(seconds: lastKnownTime, preferredTimescale: 600))
}
player.play()
player.volume = 0 // Set volume to 0 for feed view
}
}
.onDisappear {
// Pause the video and store the last known time
viewModel.lastKnownTime = player.currentTime().seconds
player.pause()
}
.contentShape(Rectangle())
.gesture(TapGesture(count: 2).onEnded {
print("Double tap detected")
viewModel.isFullScreen.toggle()
})
.simultaneousGesture(TapGesture().onEnded {
print("Single tap detected")
player.volume = 1 // Set volume to 1
})
}
}
.maxSize()
.fullScreenCover(isPresented: $viewModel.isFullScreen) {
AVPlayerViewControllerRepresented(viewModel: viewModel)
}
}
}
class VideoPlayerViewModel: ObservableObject {
@Published var player: AVPlayer?
@Published var lastKnownTime: Double?
@Published var isFullScreen: Bool = false
@Published var isFeedView: Bool
init(url: URL, isFeedView: Bool = true) {
player = AVPlayer(url: url)
lastKnownTime = nil
self.isFeedView = isFeedView
if isFeedView {
registerForPlaybackEndNotification()
}
}
private func registerForPlaybackEndNotification() {
NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player?.currentItem, queue: nil) { [weak self] _ in
self?.videoDidFinish()
}
}
private func videoDidFinish() {
// Replay logic for feed view
if isFeedView, let player = player {
player.seek(to: .zero)
player.play()
}
}
}
我目前的手势代码是基于this的,但我希望能够扩大可检测区域,这样当我在视频上的任何地方双击时,它就会进入全屏.我读到.contentShape(Rectangle())
应该做到这一点,但到目前为止还没有奏效.我遗漏了什么?