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
相关产品推荐
相关产品推荐

