iOS全屏播放视频时如何让Status Bar保持可见?
解决AVPlayerViewController全屏播放时显示状态栏的问题
我明白你现在的困扰——用AVPlayerViewController全屏播放视频时,状态栏总是自动隐藏,试了各种方法都没效果。别担心,咱们来一步步搞定这个问题。
问题根源
AVPlayerViewController是系统封装的播放器控制器,默认在全屏播放状态下会自动隐藏状态栏,而且它的部分状态栏相关逻辑是内部处理的,直接修改现有代码可能达不到预期效果。我们需要通过自定义子类+调整状态栏偏好设置来解决。
具体解决方案
1. 创建自定义AVPlayerViewController子类
首先,我们需要继承AVPlayerViewController,重写状态栏隐藏的偏好设置,让它始终不隐藏状态栏:
import AVKit class CustomAVPlayerViewController: AVPlayerViewController { // 强制返回false,让状态栏始终显示 override var prefersStatusBarHidden: Bool { return false } // 可选:设置状态栏更新的动画效果 override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation { return .fade } }
2. 修改原ViewController代码
把你原来的playerController替换成自定义的子类实例,同时调整present的相关设置:
import UIKit import AVFoundation import AVKit class ViewController: UIViewController { // 使用自定义的播放器控制器 var playerController = CustomAVPlayerViewController() var player: AVPlayer? override func viewDidLoad() { super.viewDidLoad() let videoString = Bundle.main.path(forResource: "Buspro", ofType: "mp4") if let urlString = videoString, let videoURL = URL(fileURLWithPath: urlString) { self.player = AVPlayer(url: videoURL) self.playerController.player = self.player } } @IBAction func Play(_ sender: Any) { self.playerController.showsPlaybackControls = false // 设置modalPresentationStyle为fullScreen,确保状态栏设置生效 self.playerController.modalPresentationStyle = .fullScreen self.present(self.playerController, animated: true) { self.playerController.player?.play() } } // 确保当前ViewController也不隐藏状态栏 override var prefersStatusBarHidden: Bool { return false } }
3. 检查Info.plist设置
这一步非常关键,必须确保你的项目Info.plist中,View controller-based status bar appearance这个键的值设置为YES(如果没有这个键,就添加它)。这个设置会让系统优先使用ViewController的状态栏偏好,而不是全局设置。
为什么这样有效?
- 自定义子类重写了
prefersStatusBarHidden,强制AVPlayerViewController始终显示状态栏,覆盖了它默认的全屏隐藏逻辑。 - 设置
modalPresentationStyle为.fullScreen,确保present后的控制器能正确应用状态栏设置。 - 原ViewController也重写了状态栏偏好,避免present过程中状态栏状态混乱。
现在你可以运行代码试试,播放视频时状态栏应该就能正常显示了!
内容的提问来源于stack exchange,提问作者Armaniac47
相关产品推荐
相关产品推荐

