2016-08-27 133 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