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

iOS 16下AVPlayerViewController设showsPlaybackControls=true却不显示播放控件?

iOS 16+ AVPlayerViewController 播放控件不显示问题修复

问题分析

iOS 16 后,AVPlayerViewController 的控件显示逻辑发生变更,直接设置 showsPlaybackControls = true 可能因视图未完成布局、播放器状态未稳定,导致控件无法初始化显示。但点击视频后触发了控件初始化流程,此时设置 false 可隐藏控件,也验证了这一点。

可行修复方案

方案1:延迟设置播放控件属性

在播放器启动后,延迟一小段时间再设置控件属性,确保视图布局和播放器状态稳定:

var playerController = AVPlayerViewController()
var playerItem = AVPlayerItem(asset: assetComp)
player = AVPlayer(playerItem: playerItem)
playerController.player = player
self.view.addSubview(playerController.view)
self.addChild(playerController)
player.play()

// 延迟执行,保证视图布局完成
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    playerController.showsPlaybackControls = true
}

方案2:在布局完成后设置

若在自定义 ViewController 中使用,可重写 viewDidLayoutSubviews,在视图布局完成后设置控件属性:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    playerController.showsPlaybackControls = true
}

方案3:监听播放器就绪状态

监听 AVPlayerItem 的就绪状态,待资源加载完成后再设置控件:

var playerController = AVPlayerViewController()
var playerItem = AVPlayerItem(asset: assetComp)
player = AVPlayer(playerItem: playerItem)
playerController.player = player
self.view.addSubview(playerController.view)
self.addChild(playerController)

// 监听播放器状态,就绪后再设置控件
var statusObserver: NSKeyValueObservation?
statusObserver = playerItem.observe(\.status, options: [.new]) { [weak self] item, _ in
    guard let self = self, item.status == .readyToPlay else { return }
    self.playerController.showsPlaybackControls = true
    self.player.play()
    statusObserver = nil
}

内容的提问来源于stack exchange,提问作者ItsAlwaysThere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:02:03