【问题标题】:How to get rid of an extra status bar?如何摆脱额外的状态栏?
【发布时间】:2016-08-27 12:34:03
【问题描述】:

所以,我有一个以模态方式呈现的 UITableViewController。点击一个单元格会启动一个全屏播放器(AVPlayerViewController)。它以self.presentViewController(...) 呈现。

一切正常,只是现在显示了一个额外的状态栏。当您点击播放器视图时,这两个视图中只有一个会被隐藏。

func play (url: NSURL, time: NSTimeInterval) {

    let asset = AVURLAsset(URL: url)
    let playerItem = AVPlayerItem(asset: asset)
    let player = AVPlayer(playerItem: playerItem)
    let playerController = AVPlayerViewController()
    playerController.player = player

    playerController.modalPresentationStyle = .OverFullScreen

    presentViewController(playerController, animated: true) {
        player.seekToTime(CMTime(seconds: time, preferredTimescale:
            playerItem.currentTime().timescale))
            player.play()
    }

}

我尝试将模态演示样式设置为.OverFullScreen。它没有帮助。

编辑:

为了清楚起见,我附上几张截图。

当我展示播放器 VC 时,它看起来是这样的。如您所见,有两个状态栏相互重叠。

当我点击播放器视图时,只有其中一个会消失。

我想要的是只有一个状态栏(点击后会隐藏),而不是两个。

【问题讨论】:

    标签: ios swift uikit


    【解决方案1】:

    如果你想彻底摆脱状态栏:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
         application.statusBarHidden = true
         return true
    }
    

    或者如果你想摆脱视图中的状态栏,只需添加

    UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 
    

    在你的viewDidLoad

    【讨论】:

    • 恐怕不能解决问题。我用一些截图编辑了我的原始帖子。
    • 所以你想去掉显示时钟等的状态栏,保留显示视频进度的状态栏?
    • 并非如此。我想删除带有时钟等的第二个状态栏。正如您从第二个屏幕截图中看到的那样,一个在点击时会按原样隐藏,而另一个(您可以从显示的电池指示器中看出)仍然存在。
    • 在第二张截图上,你不能做UIApplication.sharedApplication().setStatusBarHidden(true, withAnimation: .None) 吗?
    • setStatusBarHidden 在 iOS 9 中已弃用。作为替代方案,UIViewController 上有一个方法可以被覆盖“prefersStatusBarHidden -> Bool”。我试过了,但没有任何改变。
    【解决方案2】:

    我找到了解决此问题的方法。不过,这更像是一种 hacky 解决方法。

    1) 首先我在 Info.plist 中将 View controller-based status bar appearance 设置为 YES,因为我想明确说明这一点(我猜,YES 无论如何都是默认值)。

    2) 我在视图控制器中添加了一个布尔属性,它以模态方式呈现上述UITableViewController(从现在起我们将其称为“Back VC”)。

    var statusBarHidden = false {
        didSet {
            self.setNeedsStatusBarAppearanceUpdate()
        }
    }
    

    3) 我已经覆盖了prefersStatusBarHidden,因此它会返回第二步中存储在变量中的任何内容。

    override func prefersStatusBarHidden() -> Bool {
        return statusBarHidden
    }
    

    4) 假设backVC 指向“Back VC”,我对presentViewController 的完成块添加了一些更改。基本上,我让“Back VC”隐藏了它的状态栏,所以我们只有AVPlayerViewController管理的那个。

    presentViewController(playerController, animated: true) {
         if UI_USER_INTERFACE_IDIOM() == .Pad {
            backVC.statusBarHidden = true
         }
         player.seekToTime(CMTime(seconds: time, preferredTimescale:
             playerItem.currentTime().timescale))
             player.play()
    }
    

    5) 当玩家被解散时,我们需要恢复原来的状态栏。一个很好的地方是我们的模态VCviewWillAppear

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        if UI_USER_INTERFACE_IDIOM() == .Pad {
            backVC.statusBarHidden = false
        }
    }
    

    它有效,但肯定感觉不对。如果您知道更好的解决方案,请随时分享。

    【讨论】: