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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:57:16