2017-09-17 20 views
1

statusBar smoothly hide statusBarをスムーズに隠すためにこのチュートリアルに従っており、練習プロジェクトで使用するとすべて正常に動作します。 SplitVCを持たず、tabBarを持っていて、navVC & tableViewを使っていて、すべてうまくいけば他のプロジェクトのコードを使用します。それらの私は正常に表示/消滅させることができます。Swift iOS -SplitViewControllerでステータスバーを非表示にしませんか?

実際のプロジェクトでは、iPad用にSplitViewControllerを使用しています。リンクからSplitViewControllerへの指示を実装したときに、statusBarが隠れていないことに気付きました。私はAppleのデフォルトのMasterDetailAppを使って新しいプロジェクトを作って、間違っていないことを確認しましたが、そこではうまくいきません。私はAppleの元のコードのすべてを維持し、のみ/ステータスバーが表示されるように、私はView controller-based status bar appearanceを追加info.plist

  1. 消え、私は紫を追加したストーリーボードにYES

  2. にそれを設定する必要がメソッドに追加しますボタンをDetailVCに合わせて、statusBarの消滅をトリガーします。また、バックバーボタンが消える/再表示されるようにメソッドに追加しました

  3. statusBarをDetailVCシーンに表示/非表示にするためのすべてのメソッドを追加しました。

  4. 私がステータスバーと戻るボタンが

enter image description here

enter image description here

を再表示させるためにシーンにtapGestureを追加しました私は、日付が登場し、マスターシーンにプラスボタンをクリックしましたそれをクリックしてDetailVCに行き、紫色のbuttonPressedを押してstatusBarとbackButtonを隠すが、backButtonだけが隠される。バックグラウンドに触れ、backButtonが再び現れます。 statusBarは移動しません。

私はアップル社のプロジェクトのすべての元のコードを保持し、その下に地雷を追加しました:

class DetailViewController: UIViewController { 

    //MARK:- Apple's code 
    @IBOutlet weak var detailDescriptionLabel: UILabel! 

    func configureView() { 
     if let detail = detailItem { 
      if let label = detailDescriptionLabel { 
       label.text = detail.description 
      } 
     } 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     configureView() 

     // make backButton and statusBar reappear when scene is tapped 
     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(showBackButtonAndStatusBar)) 
     view.addGestureRecognizer(tapGesture) 
    } 

    var detailItem: NSDate? { 
     didSet { 
      configureView() 
     } 
    } 

    //MARK:- Outside of the tapGesture in viewDidLoad everything below here is what I added 

    // bool to determine wether to hide the statusBar or not 
    var statusBarShouldBeHidden = false 

    // api method to allow the staus bar to be hidden 
    override var prefersStatusBarHidden: Bool{ 
     return statusBarShouldBeHidden 
    } 

    // api method to animate status bar appearance/disappearance 
    override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{ 
     return .slide 
    } 

    @IBAction func buttonTapped(_ sender: UIButton) { 

     // 1. hide backBar button 
     navigationItem.setHidesBackButton(true, animated: false) 

     // 2. set bool to true 
     statusBarShouldBeHidden = true 

     UIView.animate(withDuration: 0.25){ 
      // 3. api method to allow the statusBar to disappear 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 
    } 

    //called when background is touched and added to tapGesture in viewDidLoad 
    @objc func showBackButtonAndStatusBar(){ 

     // 1. set bool to false 
     statusBarShouldBeHidden = false 

     UIView.animate(withDuration: 0.25){ 
      // 2. bring statusBar back 
      self.setNeedsStatusBarAppearanceUpdate() 
     } 

     // 3. bring backButton back 
     navigationItem.setHidesBackButton(false, animated: true) 
    } 
} 

どのように私はSplitViewVCは私がステータスバーを非表示できるように得ることができますか?

+0

我々はまたできたので、それを隠すことができます。 – Jageen

+0

これを解決しましたか? – Jageen

+0

@Jageen私は実際にそれの疲れだけステータスバーを維持することを決めました。 SplitViewControllerは、私のiOS時代の頭痛の最大の頭痛でなければなりません。私は多分、私がSplitViewController自体にそれを変更する必要が自分自身に言ったが、その後、問題は、それがsplitVCに接続されたすべての子VCに幅広いアプリケーションを適用したいだろう。それは私が –

答えて

4

詳細ビューコントローラーを介してステータスバーを非表示にしているようです。ユーザーインターフェイスのステータスバーは、ビューコントローラー階層の上にあるため、スプリットビューコントローラーによってのみ制御されます。したがって、ステータスバーの動作を制御する最も簡単な方法は、UISplitViewControllerをサブクラス化し、サブクラスのprefersStatusBarHidden計算プロパティをオーバーライドすることです。また、ストーリーボードに移動し、アイデンティティインスペクタのスプリットビューコントローラのカスタムクラスフィールドをサブクラスに変更してください。

---回答済み--- @LanceSamaria大丈夫、上記のコードを取り上げ、いくつかのものを微調整しました。まず第一に、私はボタンアクションを追加し、タップジェスチャーは追加しませんでした。また、これは、マスタービューに戻るためにはUIで重要なので、「戻る」ボタンを非表示にしてコメントアウトしました。とにかく、ボタンをクリックすると、SplitViewControllerはステータスバーを非表示にします。もう一度ボタンをクリックすると、ステータスバーが再び表示されます。

輸入のUIKit

クラスDetailViewController:またのUIViewController {

@IBOutlet weak var detailDescriptionLabel: UILabel! 

var statusBarShouldBeHidden = false 

func configureView() { 
    // Update the user interface for the detail item. 
    if let detail = self.detailItem { 
     if let label = self.detailDescriptionLabel { 
      label.text = detail.description 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.configureView() 
} 

/* override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation{ 
    return .slide 
} */ 


var detailItem: NSDate? { 
    didSet { 
     // Update the view. 
     self.configureView() 
    } 
} 

@IBAction func buttonTapped(_ sender: UIButton) { 
    // 1. hide backBar button 
    //navigationItem.setHidesBackButton(true, animated: false) 

    // 2. set bool to true 
    statusBarShouldBeHidden = !statusBarShouldBeHidden 

    UIView.animate(withDuration: 0.25){ 
     // 3. api method to allow the statusBar to disappear 
     guard let svc = self.splitViewController as? SplitViewController else { return } 
     svc.statusBarShouldBeHidden = self.statusBarShouldBeHidden 
     svc.setNeedsStatusBarAppearanceUpdate() 
    } 
} 

}

、もう一つは本当に重要なこと。以下は、私の分割ビューコントローラサブクラスのコードです。スプリットビューコントローラとディテールコントローラの両方で同じ変数名 "statusBarShouldBeHidden"を使用することに注意してください。

輸入のUIKit

クラスSplitViewController:UISplitViewController {

var statusBarShouldBeHidden = false 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override var prefersStatusBarHidden: Bool { 
    return statusBarShouldBeHidden 
} 

}

は、この質問を投稿いただきありがとうございます。これは私がこの問題を解決しようと多くのことを学ぶのを助けました。あなたはまだこれについて何か質問がある場合は私に知らせてください。 (ネイティブ)興味深いが、アプリの設定

+1

答えてくれてありがとう。私はあなたが提案したものについて実際に考えていましたが、SplitVCに接続されたすべてのVCがステータスバーを削除して、私が望んでいないことに気付きました。その後、タオルに投げ込んでステータスバーを保持することに決めました。 SplitVCは頭痛です。私はすべてのサブクラス化し、すでに接続している。私が走っているこれらの他のバグをすべて終えたら、私はそれに戻ります。私はあなたの答えがある限り、誰かがステータスバーが –

+0

@LanceSamariaこんにちはを削除することをすべての子供のVCを望んでいるとして正しいと思うので、私はあなたをupvoteよ、スタックオーバーフローが私の更新の答えを通知するかどうかはわからないので、私は」あなたに知らせるためにコメントしています。 –

+0

私はあなたの答えの上に見て、あなたはトップビューコントローラでそれを変更することについて正しいです。私は子供VCを持っていて、ステータスバーを隠す唯一の方法は親VC(navVC)の中に隠すことでした。私はあなたの答えを受け入れられた答えとして受け入れます!ありがとう –

関連する問題