如何彻底禁用视频播放控制?已隐藏控件仍可拖拽调整进度
彻底禁用AVPlayerViewController的拖拽控制功能
你可以通过以下几种简便方法彻底禁用视频的拖拽调整进度功能:
方法一:添加遮罩视图拦截触摸事件
直接在AVPlayerViewController的视图上添加全屏遮罩,拦截所有触摸手势,阻止用户与播放视图的交互。修改你的makeUIViewController方法如下:
func makeUIViewController(context: Context) -> AVPlayerViewController { let controller = AVPlayerViewController() controller.player = player controller.showsPlaybackControls = false controller.videoGravity = .resizeAspectFill player.actionAtItemEnd = .none // 添加全屏遮罩视图 let tapBlockerView = UIView() tapBlockerView.translatesAutoresizingMaskIntoConstraints = false controller.view.addSubview(tapBlockerView) NSLayoutConstraint.activate([ tapBlockerView.topAnchor.constraint(equalTo: controller.view.topAnchor), tapBlockerView.leadingAnchor.constraint(equalTo: controller.view.leadingAnchor), tapBlockerView.trailingAnchor.constraint(equalTo: controller.view.trailingAnchor), tapBlockerView.bottomAnchor.constraint(equalTo: controller.view.bottomAnchor) ]) NotificationCenter.default.addObserver(context.coordinator, selector: #selector(context.coordinator.restartPlayback), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem) return controller }
此方法简单可靠,不依赖私有API,不存在审核风险。
方法二:禁用内部播放视图的手势识别器
遍历AVPlayerViewController的视图层级,禁用所有手势识别器,阻止拖拽等交互:
func makeUIViewController(context: Context) -> AVPlayerViewController { let controller = AVPlayerViewController() controller.player = player controller.showsPlaybackControls = false controller.videoGravity = .resizeAspectFill player.actionAtItemEnd = .none // 延迟执行确保视图层级加载完成 DispatchQueue.main.async { self.disableAllGestures(in: controller.view) } NotificationCenter.default.addObserver(context.coordinator, selector: #selector(context.coordinator.restartPlayback), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem) return controller } // 递归禁用所有视图的手势识别器 private func disableAllGestures(in view: UIView) { view.gestureRecognizers?.forEach { $0.isEnabled = false } view.subviews.forEach { disableAllGestures(in: $0) } }
该方法会禁用所有触摸相关的手势,包括双击暂停/播放、拖拽进度等,需注意延迟执行确保视图初始化完成。
方法三:直接使用AVPlayerLayer自定义播放器(最彻底)
如果不需要AVPlayerViewController的额外功能,直接用AVPlayerLayer构建播放器,完全控制交互逻辑:
struct CustomVideoPlayer: UIViewRepresentable { var player: AVPlayer func makeCoordinator() -> Coordinator { Coordinator(parent: self) } func makeUIView(context: Context) -> UIView { let view = UIView() let playerLayer = AVPlayerLayer(player: player) playerLayer.videoGravity = .resizeAspectFill view.layer.addSublayer(playerLayer) player.actionAtItemEnd = .none NotificationCenter.default.addObserver(context.coordinator, selector: #selector(context.coordinator.restartPlayback), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem) return view } func updateUIView(_ uiView: UIView, context: Context) { guard let playerLayer = uiView.layer.sublayers?.first as? AVPlayerLayer else { return } playerLayer.frame = uiView.bounds } class Coordinator: NSObject { var parent: CustomVideoPlayer init(parent: CustomVideoPlayer) { self.parent = parent } @objc func restartPlayback() { parent.player.seek(to: .zero) } } }
这种方式下播放器默认无任何交互手势,完全由你掌控,是最彻底的解决方案。
内容的提问来源于stack exchange,提问作者MaxPayne777
相关产品推荐
相关产品推荐

