2016-08-27 138 views
1

所以,我有一个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

我想要的只是一个状态栏(它在窃听后隐藏,因为它应该),而不是两个。

回答

0

我找到了解决这个问题的方法。尽管如此,这更多的是一种哈克解决方法。

1)首先,我在Info.plist中设置了View controller-based status bar appearanceYES,因为我想明确说明这一点(我猜,YES是默认的)。

2)我在视图控制器中添加了一个布尔属性,它以模态方式呈现了上面提到的UITableViewController(从现在开始我们称之为“返回VC”)。

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

3)我重写prefersStatusBarHidden所以它返回任何被存储在从所述第二步骤中的变量。

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

4)假设backVC指向“回到VC”,我加入presentViewController的完成块中的一些变化。基本上,我让“返回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 
    } 
} 

它的作品,但肯定不觉得正确。如果你知道更好的解决方案,随时分享。

0

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

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

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

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

viewDidLoad

+0

恐怕它不能解决问题。我用一些截图编辑了我原来的帖子。 – David

+0

所以你想删除显示时钟等状态栏,并保持显示视频进度状态栏? –

+0

不是真的。我想用时钟等来移除第二个状态栏。从第二个屏幕截图中可以看出,它应该隐藏在自来水中,另一个(可以通过显示的电池指示器告诉它)仍然存在。 – David