如何摆脱额外的状态栏?

时间:2016-08-27 12:34:04

标签: ios swift uikit

所以,我有一个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时,它看起来就像那样。如您所见,有两个状态栏相互重叠。

player vc before tapping on the player view

当我点击播放器视图时,只有其中一个消失。 player vc after tapping on the player view

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

2 个答案:

答案 0 :(得分:0)

如果你想完全摆脱状态栏:

Height

或者,如果您想要删除视图中的状态栏,只需添加

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

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

答案 1 :(得分:0)

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

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)当玩家被解雇时,我们需要取回原来的状态栏。一个好的地方就是我们的模态VC viewWillAppear

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

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