You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何彻底禁用视频播放控制?已隐藏控件仍可拖拽调整进度

彻底禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:55:14